Wie zum Bearbeiten von MS Word-Dokumenten mit Java?
Ich habe einige Word-Vorlagen, und meine Anforderung ist, ersetzen Sie einige der Wörter/Platzhalter in das Dokument auf der Grundlage der Benutzereingabe, die mit Java. Ich habe versucht, viele Bibliotheken, darunter auch 2-3 Versionen von docx4j
aber nichts arbeiten, naja, Sie hat einfach nicht alles tun!
Ich weiß, diese Frage wurde vorher gefragt, aber ich habe versucht, alle Möglichkeiten, die ich kenne. Also, mit welcher java-Bibliothek, die ich kann "wirklich" ersetzen/Bearbeiten dieser Vorlagen? Meine Vorliebe gilt der "easy to use /Paar line of codes" - Typ-Bibliotheken.
Ich bin mit Java 8 und meinen MS-Word-Vorlagen sind in MS Word 2007.
Update
Dieser code geschrieben ist durch die Verwendung der Beispielcode von SO Mitglied Joop Eggen
public Main() throws URISyntaxException, IOException, ParserConfigurationException, SAXException
{
URI docxUri = new URI("C:/Users/Yohan/Desktop/yohan.docx");
Map<String, String> zipProperties = new HashMap<>();
zipProperties.put("encoding", "UTF-8");
FileSystem zipFS = FileSystems.newFileSystem(docxUri, zipProperties);
Path documentXmlPath = zipFS.getPath("/word/document.xml");
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(Files.newInputStream(documentXmlPath));
byte[] content = Files.readAllBytes(documentXmlPath);
String xml = new String(content, StandardCharsets.UTF_8);
//xml = xml.replace("#DATE#", "2014-09-24");
xml = xml.replace("#NAME#", StringEscapeUtils.escapeXml("Sniper"));
content = xml.getBytes(StandardCharsets.UTF_8);
Files.write(documentXmlPath, content);
}
Jedoch dies gibt die folgende Fehlermeldung
java.nio.file.ProviderNotFoundException: Provider "C" Not found
at: java.nio.file.FileSystems.newFileSystem(FileSystems.java:341) at java.nio.file.FileSystems.newFileSystem(FileSystems.java:341)
at java.nio.fileFileSystems.newFileSystem(FileSystems.java:276)
- vielleicht für die Gegenleistung (würde ich gehen für Apache HWPF): stackoverflow.com/questions/203174/...
- Link erstellt vor 5 Jahren. Java 8 war nicht dort zu dieser Zeit.
- Ist MS Word 2007 schon .docx? Denn das format ist perfekt, können Sie einen java-zip-Datei-system und ändern /word/content.xml. Die Bibliotheken übernehmen keine Gewähr für die original-format.
- leider ist es in der Tat, kann zu Problemen führen 🙁
- Ja, es ist Docx. Bevorzugen, um zu sehen, eine Bibliothek, wissen Sie, einfach.
- Gibt es eine Beispiel-code?
- Die XML ist lesbar, auch das laden der DOM (oder nur text), ersetzen Sie die Platzhalter und fertig. Aber bin ich vielleicht zu naiv w.r.t. die Anforderungen. Umbenennen .docx in .zip und werfen Sie einen Blick. Ich werde einige Beispiel-code nach einem moment.
- Ich habe nie etwas gemacht, das mit Word, aber ich habe einmal verwendet Apache POI für Excel-und es funktionierte ziemlich gut, für beide .xls-und .xlsx: poi.apache.org
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kann man verwenden für docx (ein zip mit den XML-und anderen Dateien) eine java-zip-Datei-system und XML-oder text-Verarbeitung.
Bei der Verwendung von XML:
Dann können Sie XPath verwenden, um die Orte und schreiben der XML wieder zurück.
Es sogar sein könnte, dass Sie nicht brauchen, XML, konnte aber ersetzen Sie Platzhalter:
Für eine schnelle Entwicklung, umbenennen, eine Kopie der .docx zu name mit der .zip-Datei-Erweiterung ist, und untersuchen Sie die Dateien.
File.write
sollte schon gelten StandardOpenOption.TRUNCATE_EXISTING, aber ich habeFiles.delete
da einige Fehler aufgetreten. Siehe Kommentare.Files.copy
etc.The images are in /media
was meinst du? Ich habe Bilder und Tabellen in meiner Vorlage. Ich will nicht zu berühren Sie einen von Ihnen über Java, wollte nur wissen, ob Ihr Beispiel die Datei Lesen können, ersetzen Sie das "text" und schreib zurück wie es war; das heißt, ohne Zerstörung der Bilder, Tabellen im Dokument, aber natürlich mit der ersetzte text.Document doc = builder.parse(Files.newInputStream(documentXmlPath));
von wo Sie importiert das?org.w3c.Document
, undFiles
ist Java 7 SE. Vielleicht erstmal versuchen, nicht die XML sondern die nur-text-version; dass der code vollständig ist.java.nio.file.ProviderNotFoundException
URI docxUri = new URI("jar:file:/C:/Users/Yohan/Desktop/yohan.docx");
Ohne Protokoll Sie suchten nach "C:" - Protokoll. Es ist einFile.toURI()
aber mit "jar:" in front.java.nio.file.FileAlreadyExistsException: word/document.xml
Versuchen Apache POI.
POI
arbeiten können mitdoc
unddocx
, aberdocx
ist mehr dokumentiert damit die Unterstützung besser.UPD: Sie können XDocReport, die POI. Auch ich empfehle die Verwendung
xlsx
für Vorlagen, weil es mehr geeignet und mehr dokumentiertVerbrachte ich ein paar Tage an diesem Problem, bis ich herausfand, dass das, was den Unterschied macht ist die
try-with-resources
auf das Dateisystem Instanz, die in Joop eggens snippet aber nicht in Frage snippet:try (FileSystem zipFS = FileSystems.newFileSystem(docxUri, zipProperties))
Ohne eine solche
try-with-resources
block, derFileSystem
Ressource nicht geschlossen wird (wie bereits in Java tutorial), und das word-Dokument nicht geändert.Schritt zurück ein wenig, es gibt über 4 verschiedene Ansätze für die Bearbeitung Wörter/Platzhalter:
Vor der Auswahl einer, sollten Sie überlegen, ob Sie auch in der Lage sein müssen, zu behandeln:
Wenn Sie diese, dann MERGEFIELD oder DOCPROPERTY-Felder sind wohl aus (obwohl Sie können auch verwenden, WENN die Felder, wenn Sie finden eine Bibliothek, die diese unterstützt). Und das einfügen von Bildern macht, DOM/SAX-manipulation, wie dies in einer der anderen Antworten, messier und fehleranfällig.
Die anderen Dinge zu berücksichtigen sind: