Einführung in Docx4J

1. Übersicht

In diesem Artikel konzentrieren wir uns auf die Erstellung eines. docx- Dokument mit der docx4j-Bibliothek.

Docx4j ist eine Java-Bibliothek, die zum Erstellen und Bearbeiten von Office OpenXML- Dateien verwendet wird. Dies bedeutet, dass sie nur mit dem Dateityp .docx arbeiten kann, während ältere Versionen von Microsoft Word die Erweiterung .doc (Binärdateien) verwenden.

Beachten Sie, dass das OpenXML- Format von Microsoft Office ab der Version 2007 unterstützt wird.

2. Maven Setup

Um mit docx4j arbeiten zu können, müssen wir die erforderliche Abhängigkeit in unsere pom.xml einfügen :

 org.docx4j docx4j 3.3.5   javax.xml.bind jaxb-api 2.1 

Beachten Sie, dass wir immer die neuesten Abhängigkeitsversionen im Maven Central Repository nachschlagen können.

Die JAXB- Abhängigkeit wird benötigt, da docx4j diese Bibliothek unter der Haube verwendet, um XML-Teile in einer docx- Datei zu marshallen / unmarshallen .

3. Erstellen Sie ein Docx-Dateidokument

3.1. Textelemente und Styling

Lassen Sie uns zunächst sehen, wie Sie eine einfache docx- Datei erstellen - mit einem Textabsatz :

WordprocessingMLPackage wordPackage = WordprocessingMLPackage.createPackage(); MainDocumentPart mainDocumentPart = wordPackage.getMainDocumentPart(); mainDocumentPart.addStyledParagraphOfText("Title", "Hello World!"); mainDocumentPart.addParagraphOfText("Welcome To Baeldung"); File exportFile = new File("welcome.docx"); wordPackage.save(exportFile); 

Hier ist die resultierende Datei welcome.docx :

Um ein neues Dokument zu erstellen, müssen wir das WordprocessingMLPackage verwenden , das eine docx- Datei im OpenXML- Format darstellt, während die MainDocumentPart- Klasse eine Darstellung des Hauptteils document.xml enthält .

Um die Dinge zu klären, entpacken wir die Datei welcome.docx und öffnen die Datei word / document.xml, um zu sehen, wie die XML-Darstellung aussieht:

      Hello World!     Welcome To Baeldung!   

Wie wir sehen können, wird jeder Satz durch einen Textlauf ( r ) ( t ) innerhalb eines Absatzes ( p ) dargestellt , und dafür ist die Methode addParagraphOfText () gedacht .

Die addStyledParagraphOfText () machen etwas mehr als das; Es werden Absätzeigenschaften ( pPr ) erstellt, die den Stil enthalten, der auf den Absatz angewendet werden soll .

Einfach ausgedrückt, Absätze deklarieren separate Läufe, und jeder Lauf enthält einige Textelemente:

Um ein gut aussehendes Dokument zu erstellen, müssen wir die volle Kontrolle über diese Elemente (Absatz, Ausführung und Text) haben.

Lassen Sie uns also herausfinden , wie Sie unseren Inhalt mithilfe des runProperties ( RPr ) -Objekts stilisieren können :

ObjectFactory factory = Context.getWmlObjectFactory(); P p = factory.createP(); R r = factory.createR(); Text t = factory.createText(); t.setValue("Welcome To Baeldung"); r.getContent().add(t); p.getContent().add(r); RPr rpr = factory.createRPr(); BooleanDefaultTrue b = new BooleanDefaultTrue(); rpr.setB(b); rpr.setI(b); rpr.setCaps(b); Color green = factory.createColor(); green.setVal("green"); rpr.setColor(green); r.setRPr(rpr); mainDocumentPart.getContent().add(p); File exportFile = new File("welcome.docx"); wordPackage.save(exportFile);

So sieht das Ergebnis aus:

Nachdem wir mit createP () , createR () und createText () einen Absatz, einen Lauf und ein Textelement erstellt haben, haben wir ein neues runProperties- Objekt ( RPr ) deklariert , um dem Textelement etwas Stil zu verleihen.

Das RPR - Objekt einzustellen Formatierungseigenschaften, Bold (verwendet wird B ), Kursiv ( I ) und aktiviert ( Caps ), werden diese Eigenschaften in den Text Lauf angewandt , um die Verwendung von setRPr () Methode.

3.2. Arbeiten mit Bildern

Docx4j bietet eine einfache Möglichkeit, Bilder zu unserem Word-Dokument hinzuzufügen:

File image = new File("image.jpg" ); byte[] fileContent = Files.readAllBytes(image.toPath()); BinaryPartAbstractImage imagePart = BinaryPartAbstractImage .createImagePart(wordPackage, fileContent); Inline inline = imagePart.createImageInline( "Baeldung Image (filename hint)", "Alt Text", 1, 2, false); P Imageparagraph = addImageToParagraph(inline); mainDocumentPart.getContent().add(Imageparagraph);

Und so sieht die Implementierung der Methode addImageToParagraph () aus:

private static P addImageToParagraph(Inline inline) { ObjectFactory factory = new ObjectFactory(); P p = factory.createP(); R r = factory.createR(); p.getContent().add(r); Drawing drawing = factory.createDrawing(); r.getContent().add(drawing); drawing.getAnchorOrInline().add(inline); return p; }

Zuerst haben wir die Datei erstellt, die das Bild enthält, das wir in unseren Hauptdokumentteil einfügen möchten . Dann haben wir das Byte-Array, das das Bild darstellt, mit dem wordMLPackage- Objekt verknüpft .

Sobald der Bildteil erstellt wurde, müssen wir ein Inline- Objekt mit der Methode createImageInline ( ) erstellen .

Die Methode addImageToParagraph () bettet das Inline- Objekt in eine Zeichnung ein, damit es einem Lauf hinzugefügt werden kann .

Schließlich wird wie ein Textabsatz der Absatz, der das Bild enthält, zum mainDocumentPart hinzugefügt .

Und hier ist das resultierende Dokument:

3.3. Tabellen erstellen

Mit Docx4j können Sie auch Tabellen (Tbl), Zeilen (Tr) und Spalten (Tc) ganz einfach bearbeiten.

Lassen Sie uns sehen, wie Sie eine 3 × 3-Tabelle erstellen und Inhalte hinzufügen:

int writableWidthTwips = wordPackage.getDocumentModel() .getSections().get(0).getPageDimensions().getWritableWidthTwips(); int columnNumber = 3; Tbl tbl = TblFactory.createTable(3, 3, writableWidthTwips/columnNumber); List rows = tbl.getContent(); for (Object row : rows) { Tr tr = (Tr) row; List cells = tr.getContent(); for(Object cell : cells) { Tc td = (Tc) cell; td.getContent().add(p); } }

Bei einigen Zeilen und Spalten erstellt die Methode createTable () ein neues Tbl- Objekt. Das dritte Argument bezieht sich auf die Spaltenbreite in Twips (dies ist eine Abstandsmessung - 1/1440 Zoll).

Einmal erstellt, können wir den Inhalt des iterieren Tabl Objekt, und fügen Absatz Objekte in jede Zelle.

Mal sehen, wie das Endergebnis aussieht:

4. Lesen eines Docx-Dateidokuments

Nachdem wir herausgefunden haben, wie Sie mit docx4j Dokumente erstellen, sehen wir uns an, wie Sie eine vorhandene docx-Datei lesen und ihren Inhalt drucken:

File doc = new File("helloWorld.docx"); WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage .load(doc); MainDocumentPart mainDocumentPart = wordMLPackage .getMainDocumentPart(); String textNodesXPath = "//w:t"; List textNodes= mainDocumentPart .getJAXBNodesViaXPath(textNodesXPath, true); for (Object obj : textNodes) { Text text = (Text) ((JAXBElement) obj).getValue(); String textValue = text.getValue(); System.out.println(textValue); }

In diesem Beispiel haben wir ein WordprocessingMLPackage- Objekt basierend auf einer vorhandenen helloWorld.docx- Datei mit der load () -Methode erstellt.

Danach haben wir einen XPath- Ausdruck ( // w: t ) verwendet, um alle Textknoten aus dem Hauptdokumentteil abzurufen.

Die Methode getJAXBNodesViaXPath () gibt eine Liste der JAXBElement- Objekte zurück.

Infolgedessen werden alle Textelemente im mainDocumentPart- Objekt in der Konsole gedruckt.

Beachten Sie, dass wir unsere docx-Dateien jederzeit entpacken können, um ein besseres Verständnis der XML-Struktur zu erhalten. Dies hilft bei der Analyse von Problemen und gibt einen besseren Einblick in deren Behebung.

5. Schlussfolgerung

In diesem Artikel haben wir herausgefunden, wie docx4j das Ausführen komplexer Vorgänge für MSWord-Dokumente erleichtert, z. B. das Erstellen von Absätzen, Tabellen, Dokumentteilen und das Hinzufügen von Bildern.

Die Codefragmente finden Sie wie immer auf GitHub.