Introduktion til Docx4J

1. Oversigt

I denne artikel vil vi fokusere på at skabe en.docx dokument ved hjælp af docx4j-biblioteket.

Docx4j er et Java-bibliotek, der bruges til at oprette og manipulere Office OpenXML filer - hvilket betyder, at det kun kan arbejde med .docx filtype, mens ældre versioner af Microsoft Word bruger en .doc udvidelse (binære filer).

Bemærk, at OpenXML format understøttes af Microsoft Office startende med 2007-versionen.

2. Maven-opsætning

For at begynde at arbejde med docx4j skal vi tilføje den krævede afhængighed i vores pom.xml:

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

Bemærk, at vi altid kan slå de nyeste afhængighedsversioner op i Maven Central Repository.

Det JAXB afhængighed er nødvendig, da docx4j bruger dette bibliotek under emhætten til at marshallere / unmarshall XML-dele i en docx fil.

3. Opret et Docx-fildokument

3.1. Tekstelementer og styling

Lad os først se, hvordan man opretter en simpel docx fil - med et tekstafsnit:

WordprocessingMLPackage wordPackage = WordprocessingMLPackage.createPackage (); MainDocumentPart mainDocumentPart = wordPackage.getMainDocumentPart (); mainDocumentPart.addStyledParagraphOfText ("Titel", "Hej verden!"); mainDocumentPart.addParagraphOfText ("Velkommen til Baeldung"); File exportFile = new File ("welcome.docx"); wordPackage.save (exportFile); 

Her er det resulterende velkommen.docx fil:

For at oprette et nyt dokument skal vi gøre brug af WordprocessingMLPackage, som repræsenterer en docx fil i OpenXML format, mens MainDocumentPart klasse har en repræsentation af hovedet document.xml en del.

Lad os pakke ud for at rydde op velkommen.docx fil, og åbn word / document.xml fil for at se, hvordan XML-repræsentationen ser ud:

      Hej Verden! Velkommen til Baeldung! 

Som vi kan se, hver sætning er repræsenteret af et løb (r) af tekst (t) inde i et afsnit (s)og det er hvad addParagraphOfText () metoden er til.

Det addStyledParagraphOfText () gør lidt mere end det; det skaber et afsnit egenskaber (pPr), der har den stil, der skal anvendes på afsnittet.

Enkelt sagt, afsnit erklærer separate kørsler, og hver kørsel indeholder nogle tekstelementer:

For at skabe et pænt dokument skal vi have fuld kontrol over disse elementer (afsnit, køre, og tekst).

Så lad os opdage, hvordan vi kan stylere vores indhold ved hjælp af runProperties (RPr) objekt:

ObjectFactory fabrik = Context.getWmlObjectFactory (); P p = factory.createP (); R r = fabrik. Skab R (); Tekst t = factory.createText (); t.setValue ("Velkommen til Baeldung"); r.getContent (). tilføj (t); p.getContent (). tilføj (r); RPr rpr = fabrik.createRPr (); BooleanDefaultTrue b = ny BooleanDefaultTrue (); rpr.setB (b); rpr.setI (b); rpr.setCaps (b); Farve grøn = factory.createColor (); green.setVal ("grøn"); rpr.setColor (grøn); r.setRPr (rpr); mainDocumentPart.getContent (). tilføj (p); File exportFile = new File ("welcome.docx"); wordPackage.save (exportFile);

Sådan ser resultatet ud:

Når vi har oprettet et afsnit, en kørsel og et tekstelement ved hjælp af createP (), createR () og createText () henholdsvis har vi erklæret en ny runProperties objekt (RPr) for at tilføje noget styling til tekstelementet.

Det rpr objekt bruges til at indstille formateringsegenskaber, fed (B), Kursiv (jeg) og aktiveres (Kasketter), disse egenskaber anvendes til tekstkørslen ved hjælp af setRPr () metode.

3.2. Arbejde med billeder

Docx4j tilbyder en nem måde at tilføje billeder til vores Word-dokument:

Filbillede = ny fil ("image.jpg"); byte [] fileContent = Files.readAllBytes (image.toPath ()); BinaryPartAbstractImage imagePart = BinaryPartAbstractImage .createImagePart (wordPackage, fileContent); Inline inline = imagePart.createImageInline ("Baeldung Image (filnavnhint)", "Alt Text", 1, 2, false); P Imageparagraph = addImageToParagraph (inline); mainDocumentPart.getContent (). tilføj (Imageparagraph);

Og her er hvad implementeringen af addImageToParagraph () metoden ligner:

privat statisk P addImageToParagraph (Inline inline) {ObjectFactory fabrik = ny ObjectFactory (); P p = factory.createP (); R r = fabrik. Skab R (); p.getContent (). tilføj (r); Tegningstegning = fabrik.createDrawing (); r.getContent (). tilføj (tegning); drawing.getAnchorOrInline (). tilføj (inline); returnere p; }

Først har vi oprettet den fil, der indeholder det billede, vi vil tilføje til vores hoveddokumentdel, og derefter har vi linket byte-arrayet, der repræsenterer billedet, med wordMLPackage objekt.

Når billeddelen er oprettet, skal vi oprette en Inline objekt ved hjælp af createImageInline () metode.

Det addImageToParagraph () metode integrere Inline objekt i en Tegning så det kan føjes til en løb.

Endelig, ligesom et tekstafsnit, føjes det afsnit, der indeholder billedet til mainDocumentPart.

Og her er det resulterende dokument:

3.3. Oprettelse af tabeller

Docx4j gør det også ret nemt at manipulere tabeller (Tbl), rækker (Tr) og kolonner (Tc).

Lad os se, hvordan du opretter en 3 × 3-tabel og tilføjer noget indhold til den:

int writableWidthTwips = wordPackage.getDocumentModel () .getSections (). get (0) .getPageDimensions (). getWritableWidthTwips (); int columnNumber = 3; Tbl tbl = TblFactory.createTable (3, 3, writableWidthTwips / columnNumber); Listerækker = tbl.getContent (); for (Objektrække: rækker) {Tr tr = (Tr) række; Liste celler = tr.getContent (); for (Objektcelle: celler) {Tc td = (Tc) celle; td.getContent (). tilføj (p); }}

I betragtning af nogle rækker og kolonner er createTable () metode skaber en ny Tbl objekt, det tredje argument refererer til søjlebredden i snit (som er en afstandsmåling - 1/1440 tommer).

Når det er oprettet, kan vi gentage indholdet af tbl objekt, og tilføj Afsnit objekter ind i hver celle.

Lad os se, hvordan det endelige resultat ser ud:

4. Læsning af et Docx-fildokument

Nu hvor vi har opdaget, hvordan vi bruger docx4j til at oprette dokumenter, lad os se, hvordan man læser en eksisterende docx-fil og udskriver dens indhold:

Fil doc = ny fil ("helloWorld.docx"); WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage .load (doc); MainDocumentPart mainDocumentPart = wordMLPackage .getMainDocumentPart (); String textNodesXPath = "// w: t"; Liste over tekstNoder = mainDocumentPart .getJAXBNodesViaXPath (textNodesXPath, sand); for (Objekt obj: textNodes) {Tekst tekst = (Tekst) ((JAXBElement) obj) .getValue (); String textValue = text.getValue (); System.out.println (textValue); }

I dette eksempel har vi oprettet en WordprocessingMLPackage objekt baseret på et eksisterende helloWorld.docx ved hjælp af belastning() metode.

Derefter har vi brugt en XPath udtryk (// w: t) for at hente alle tekstnoder fra hoveddokumentdelen.

Det getJAXBNodesViaXPath () metoden returnerer en liste over JAXBElement genstande.

Som et resultat, alle tekstelementer inde i mainDocumentPart objekt er udskrevet i konsollen.

Bemærk, at vi altid kan pakke ud vores docx-filer for at få en bedre forståelse af XML-strukturen, som hjælper med at analysere problemer og giver bedre indsigt i, hvordan vi tackler dem.

5. Konklusion

I denne artikel har vi opdaget, hvordan docx4j gør det lettere at udføre komplekse operationer på MSWord-dokument, såsom at oprette afsnit, tabeller, dokumentdele og tilføje billeder.

Kodestykkerne findes som altid over på GitHub.