Introduksjon til Docx4J

1. Oversikt

I denne artikkelen vil vi fokusere på å lage en.docx dokumentet ved hjelp av docx4j-biblioteket.

Docx4j er et Java-bibliotek som brukes til å opprette og manipulere Office OpenXML filer - noe som betyr at den bare kan fungere med .docx filtype, mens eldre versjoner av Microsoft Word bruker en .doc utvidelse (binære filer).

Merk at OpenXML format støttes av Microsoft Office fra 2007-versjonen.

2. Maven-oppsett

For å begynne å jobbe med docx4j, må vi legge til den nødvendige avhengigheten i vår pom.xml:

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

Merk at vi alltid kan slå opp de nyeste avhengighetsversjonene i Maven Central Repository.

De JAXB avhengighet er nødvendig, da docx4j bruker dette biblioteket under panseret til å marshallere / unmarshall XML-deler i en docx fil.

3. Opprett et Docx-fildokument

3.1. Tekstelementer og styling

La oss først se hvordan du lager en enkel docx fil - med tekstavsnitt:

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

Her er resultatet velkommen.docx fil:

For å lage et nytt dokument, må vi benytte oss av WordprocessingMLPackage, som representerer en docx fil i OpenXML format, mens MainDocumentPart klasse har en representasjon av hovedtemaet document.xml del.

For å rydde opp i ting, la oss pakke ut velkommen.docx filen, og åpne word / document.xml fil for å se hvordan XML-representasjonen ser ut:

      Hei Verden! Velkommen til Baeldung! 

Som vi kan se, hver setning er representert med et løp (r) av tekst (t) inne i et avsnitt (s), og det er det addParagraphOfText () metoden er for.

De addStyledParagraphOfText () gjør litt mer enn det; det skaper et avsnitt egenskaper (pPr) som holder stilen som gjelder for avsnittet.

Enkelt sagt, avsnitt erklærer separate kjøringer, og hver kjøring inneholder noen tekstelementer:

For å lage et pent utseende dokument, må vi ha full kontroll over disse elementene (avsnitt, løp, og tekst).

Så la oss oppdage hvordan vi kan stylere innholdet vårt ved hjelp av runProperties (RPr) objekt:

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

Slik ser resultatet ut:

Etter at vi har opprettet et avsnitt, et løp og et tekstelement ved hjelp av createP (), createR () og createText () henholdsvis, har vi erklært en ny runProperties objekt (RPr) for å legge til litt styling i tekstelementet.

De rpr objektet brukes til å angi formateringsegenskaper, fet (B), Kursiv (Jeg), og aktiveres (Caps), brukes disse egenskapene til teksten som kjøres med setRPr () metode.

3.2. Arbeide med bilder

Docx4j tilbyr en enkel måte å legge til bilder i Word-dokumentet vårt:

Filbilde = 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 (). legg til (Imageparagraph);

Og her er hva implementeringen av addImageToParagraph () metoden ser ut som:

privat statisk P addImageToParagraph (Inline inline) {ObjectFactory fabrikk = ny ObjectFactory (); P p = factory.createP (); R r = factory.createR (); p.getContent (). legg til (r); Tegningstegning = factory.createDrawing (); r.getContent (). legg til (tegning); drawing.getAnchorOrInline (). legg til (inline); retur p; }

Først har vi opprettet filen som inneholder bildet vi vil legge til i hoveddokumentdelen, og deretter har vi koblet byte-matrisen som representerer bildet med wordMLPackage gjenstand.

Når bildedelen er opprettet, må vi lage en På linje objektet ved hjelp av createImageInline () -metoden.

De addImageToParagraph () metoden legge inn På linje objekt i en Tegning slik at den kan legges til en løpe.

Til slutt, som et tekstavsnitt, blir avsnittet som inneholder bildet lagt til mainDocumentPart.

Og her er det resulterende dokumentet:

3.3. Lage tabeller

Docx4j gjør det også ganske enkelt å manipulere tabeller (Tbl), rader (Tr) og kolonner (Tc).

La oss se hvordan du lager en 3 × 3-tabell og legger til noe innhold i den:

int writableWidthTwips = wordPackage.getDocumentModel () .getSections (). get (0) .getPageDimensions (). getWritableWidthTwips (); int columnNumber = 3; Tbl tbl = TblFactory.createTable (3, 3, writableWidthTwips / columnNumber); Liste rader = tbl.getContent (); for (Objektrad: rader) {Tr tr = (Tr) rad; Liste celler = tr.getContent (); for (Objektcelle: celler) {Tc td = (Tc) celle; td.getContent (). legg til (p); }}

Gitt noen rader og kolonner, vil createTable () metoden skaper en ny Tbl objekt, refererer det tredje argumentet til kolonnebredden i twips (som er en avstandsmåling - 1 / 1440th of a inch).

Når den er opprettet, kan vi gjentas over innholdet i tbl objekt, og legg til Avsnitt objekter inn i hver celle.

La oss se hvordan det endelige resultatet ser ut:

4. Lese et Docx-fildokument

Nå som vi har oppdaget hvordan du bruker docx4j til å lage dokumenter, la oss se hvordan du leser en eksisterende docx-fil og skriver ut innholdet:

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

I dette eksemplet har vi opprettet en WordprocessingMLPackage objekt basert på et eksisterende helloWorld.docx ved hjelp av laste() metode.

Etter det har vi brukt en XPath uttrykk (// w: t) for å hente alle tekstnoder fra hoveddokumentdelen.

De getJAXBNodesViaXPath () metoden returnerer en liste over JAXBElement gjenstander.

Som et resultat, alle tekstelementer i mainDocumentPart objektet skrives ut i konsollen.

Vær oppmerksom på at vi alltid kan pakke ut docx-filene våre for å få en bedre forståelse av XML-strukturen, som hjelper til med å analysere problemer, og gir bedre innsikt i hvordan vi skal takle dem.

5. Konklusjon

I denne artikkelen har vi oppdaget hvordan docx4j gjør det lettere å utføre komplekse operasjoner på MSWord-dokument, for eksempel å lage avsnitt, tabeller, dokumentdeler og legge til bilder.

Kodebitene kan du finne som alltid på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found