.docx mit Java bearbeiten

MetroAffe

Mitglied
Hey, also ich bin erst seit kurzem unter den Java Programmierern und hau deswegen oft Fehler in den Code :D. Und das was ich jetzt machen möchte funktioniert nicht so wie ich es gern hätte.
Also dann fang ich mal an. Ich möchte eine Word-datei bearbeiten, also gibt es einen Ordner in dem ein template.docx liegt. Da .docx Dateien ein Archiv ist muss geöffnet werden und eine XML Datei namens document.xml darin bearbeitet werden dann abgespeichert werden in einem anderen Archiv (.docx) und auch unter anderem Namen. Ich hab das bisher alles hinbekommen, allerdings gibt es jetzt ein Problem, das Archiv wird irgendwie etwas beschädigt. Weis jemand wo ich diesen Fehler eingebaut habe? Laut Word liegt er darin, dass eine Datei (nicht die bearbeitete) während dem „kopieren“ in das fertige Archiv irgendwie beschädigt wird.
Mein Code sieht bisher so aus:
Code:
package WordDatei;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class WordDatei {
	
	private final static String ordner = "C:/Users/Lucas/template";
	
	
	
	public static void main(String[] args) {
		
		File template = new File(ordner + "/template.docx");
		if ((template.exists() && template.canRead() && template.canWrite())){
			
			try {
				//ZipArchive öffnen
				ZipFile docxFile = new ZipFile (ordner + "/template.docx");
				ZipEntry documentXML = docxFile.getEntry("word/document.xml");
					  InputStream documentXMLIS = docxFile.getInputStream(documentXML);
					  DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
					  Document doc = dbf.newDocumentBuilder().parse(documentXMLIS); 
			          
					  
					  //Datei bearbeiten start
					  
					  Element docElement = doc.getDocumentElement();
					  Element bodyElement = (Element) docElement.getElementsByTagName("w:body").item(0).getChildNodes().item(0); 
					  Element ppElement = (Element) bodyElement.getChildNodes().item(3); 
					  Element wrElement = (Element) ppElement.getChildNodes().item(1); 
					  Element mcAlElement = (Element) wrElement.getChildNodes().item(0); 
					  Element mcCoElement = (Element) mcAlElement.getChildNodes().item(0); 
					  Element wElement = (Element) mcCoElement.getChildNodes().item(0); 
					  Element wpElement = (Element) wElement.getChildNodes().item(8); 
					  Element aGrElement = (Element) wpElement.getChildNodes().item(0); 
					  Element aDaElement = (Element) aGrElement.getChildNodes().item(0); 
					  Element wpswElement = (Element) aDaElement.getChildNodes().item(3); 
					  Element wpsElement = (Element) wpswElement.getChildNodes().item(0); 
					  Element wtxElement = (Element) wpsElement.getChildNodes().item(0); 
					  Element pElement = (Element) wtxElement.getChildNodes().item(0); 
					  Element rElement = (Element) pElement.getChildNodes().item(1); 

					 
					  String text = rElement.getTextContent();
					  System.out.println(text);
					  rElement.setTextContent("Blablabla");
					  //Datei bearbeiten ende
					  
					  
					  //ZipArchive "kopieren" und speichern
					  Transformer t = TransformerFactory.newInstance().newTransformer();
					  ByteArrayOutputStream baos = new ByteArrayOutputStream();
					  t.transform(new DOMSource(doc),
					  new StreamResult(baos));

					  ZipOutputStream docxOutFile = new ZipOutputStream(
					  new FileOutputStream("Rechnung.docx"));
					  Enumeration<? extends ZipEntry> entriesIter = docxFile.entries();
					  while (entriesIter.hasMoreElements())
					  {
					    ZipEntry entry = entriesIter.nextElement();

					    if (entry.getName().equals("word/document.xml"))
					    {
					      byte[] data = baos.toByteArray();
					      docxOutFile.putNextEntry(
					        new ZipEntry(entry.getName()));
					      docxOutFile.write(data, 0, data.length);
					      docxOutFile.closeEntry();
					    }
					    else
					    {
					      InputStream incoming =
					        docxFile.getInputStream(entry);
					      byte[] data = new byte[1024 * 16];
					      int readCount =
					        incoming.read(data, 0, data.length);
					      docxOutFile.putNextEntry(
					        new ZipEntry(entry.getName()));
					      docxOutFile.write(data, 0, readCount);
					      docxOutFile.closeEntry();
					    }
					  }
					  docxOutFile.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
			
			
		} else{
			System.out.println("Datei konnte nicht gefunden oder bearbeitet werden!");
		}

	} 
}
Ich schätze ihr findet meinen Code „kacke“:p. Aber ich mach das zur Übung und aus Interesse, deswegen wäre es Nett wenn mir jemand erklären kann wo der Fehler liegt. Danke schon im Voraus.

lg
MetroAffe
 

Neue Beiträge

Zurück