Microsoft Word Processing i Java med Apache POI

1. Oversigt

Apache POI er et Java-bibliotek til arbejde med de forskellige filformater baseret på Office Open XML-standarder (OOXML) og Microsofts OLE 2 Compound Document-format (OLE2).

Denne vejledning fokuserer på support af Apache POI til Microsoft Word, det mest almindelige Office-filformat. Det gennemgår de nødvendige trin til at formatere og generere en MS Word-fil, og hvordan man analyserer denne fil.

2. Maven-afhængigheder

Den eneste afhængighed, der kræves for at Apache POI skal håndtere MS Word-filer, er:

 org.apache.poi poi-ooxml 3.15 

Klik her for den nyeste version af denne artefakt.

3. Forberedelse

Lad os nu se på nogle af de elementer, der bruges til at gøre det lettere at generere en MS Word-fil.

3.1. Ressourcefiler

Vi samler indholdet af tre tekstfiler og skriver dem i en MS Word-fil - navngivet hvile med spring.docx.

Hertil kommer, at logo-leaf.png fil bruges til at indsætte et billede i den nye fil. Alle disse filer findes på klassestien og er repræsenteret af flere statiske variabler:

offentlig statisk strenglogo = "logo-leaf.png"; offentlig statisk streng afsnit1 = "poi-word-para1.txt"; offentlig statisk streng afsnit2 = "poi-word-para2.txt"; offentlig statisk streng afsnit3 = "poi-word-para3.txt"; public static String output = "rest-with-spring.docx";

For dem der er nysgerrige, udvindes indholdet af disse ressourcefiler i arkivet, hvis link er angivet i sidste afsnit af denne vejledning, fra denne kursusside her på siden.

3.2. Hjælpermetode

Den vigtigste metode, der består af logik, der bruges til at generere en MS Word-fil, som er beskrevet i det følgende afsnit, bruger en hjælpemetode:

public String convertTextFileToString (String fileName) {try (Stream stream = Files.lines (Paths.get (ClassLoader.getSystemResource (fileName) .toURI ()))) {return stream.collect (Collectors.joining ("")); } fange (IOException | URISyntaxException e) {return null; }}

Denne metode udtrækker indhold indeholdt i en tekstfil placeret på klassestien, hvis navn er den indsendte Snor argument. Derefter sammenkædes linjer i denne fil og returnerer sammenføjningen Snor.

4. Generering af MS Word-filer

Dette afsnit giver instruktioner om, hvordan du formaterer og genererer en Microsoft Word-fil. Inden vi arbejder på en del af filen, skal vi have en XWPFDokument eksempel:

XWPFDocument-dokument = nyt XWPFDocument ();

4.1. Formatering af titel og undertekst

For at oprette titlen skal vi først instantiere XWPFParagraph klasse og indstil justeringen på det nye objekt:

XWPFParagraph title = document.createParagraph (); title.setAlignment (ParagraphAlignment.CENTER);

Indholdet af et afsnit skal pakkes ind i et XWPFRun objekt. Vi kan konfigurere dette objekt til at indstille en tekstværdi og dens tilknyttede stilarter:

XWPFRun titleRun = title.createRun (); titleRun.setText ("Byg din REST API med Spring"); titleRun.setColor ("009933"); titleRun.setBold (sand); titleRun.setFontFamily ("Courier"); titleRun.setFontSize (20);

Man skal være i stand til at udlede formålene med sætmetoderne ud fra deres navne.

På samme måde skaber vi en XWPFParagraph instans, der omslutter underteksten:

XWPFParagraph subTitle = document.createParagraph (); subTitle.setAlignment (ParagraphAlignment.CENTER);

Lad os også formatere underteksten:

XWPFRun subTitleRun = subTitle.createRun (); subTitleRun.setText ("fra grundlæggende HTTP til API-mestring"); subTitleRun.setColor ("00CC44"); subTitleRun.setFontFamily ("Courier"); subTitleRun.setFontSize (16); subTitleRun.setTextPosition (20); subTitleRun.setUnderline (UnderlinePatterns.DOT_DOT_DASH);

Det setTextPosition metode indstiller afstanden mellem underteksten og det efterfølgende billede, mens setUnderline bestemmer understregningsmønsteret.

Bemærk, at vi hårdkoder indholdet af både titlen og underteksten, da disse udsagn er for korte til at retfærdiggøre brugen af ​​en hjælpemetode.

4.2. Indsættelse af et billede

Et billede skal også pakkes ind i et XWPFParagraph eksempel. Vi ønsker, at billedet skal være vandret centreret og placeres under underteksten, så følgende uddrag skal placeres under koden ovenfor:

XWPFParagraph-billede = document.createParagraph (); image.setAlignment (ParagraphAlignment.CENTER);

Sådan indstilles afstanden mellem dette billede og teksten under det:

XWPFRun imageRun = image.createRun (); imageRun.setTextPosition (20);

Et billede tages fra en fil på klassestien og indsættes derefter i MS Word-filen med de angivne dimensioner:

Sti imagePath = Paths.get (ClassLoader.getSystemResource (logo) .toURI ()); imageRun.addPicture (Files.newInputStream (imagePath), XWPFDocument.PICTURE_TYPE_PNG, imagePath.getFileName (). toString (), Units.toEMU (50), Units.toEMU (50));

4.3. Formatering af afsnit

Sådan opretter vi det første afsnit med indhold taget fra poi-word-para1.txt fil:

XWPFParagraph para1 = document.createParagraph (); para1.setAlignment (ParagraphAlignment.BOTH); Strengstreng1 = convertTextFileToString (afsnit1); XWPFRun para1Run = para1.createRun (); para1Run.setText (streng1);

Det er tydeligt, at oprettelsen af ​​et afsnit svarer til oprettelsen af ​​titlen eller underteksten. Den eneste forskel her er brugen af ​​hjælpemetoden i stedet for hårdkodede strenge.

På samme måde kan vi oprette to andre afsnit ved hjælp af indhold fra filer poi-word-para2.txt og poi-word-para3.txt:

XWPFParagraph para2 = document.createParagraph (); para2.setAlignment (ParagraphAlignment.RIGHT); Strengstreng2 = convertTextFileToString (afsnit2); XWPFRun para2Run = para2.createRun (); para2Run.setText (streng2); para2Run.setItalic (sand); XWPFParagraph para3 = document.createParagraph (); para3.setAlignment (ParagraphAlignment.LEFT); Strengstreng3 = convertTextFileToString (afsnit3); XWPFRun para3Run = para3.createRun (); para3Run.setText (streng3);

Oprettelsen af ​​disse tre afsnit er næsten den samme, bortset fra nogle styling som justering eller kursiv.

4.4. Genererer MS Word-fil

Nu er vi klar til at skrive en Microsoft Word-fil til hukommelsen fra dokument variabel:

FileOutputStream out = ny FileOutputStream (output); document.write (ud); out.close (); document.close ();

Alle kodestykker i dette afsnit er pakket ind i en metode, der hedder håndtagSimpleDoc.

5. Analyse og test

Dette afsnit skitserer parsing af MS Word-filer og verificering af resultatet.

5.1. Forberedelse

Vi erklærer et statisk felt i testklassen:

statisk WordDocument wordDocument;

Dette felt bruges til at henvise til en forekomst af klassen, der omslutter alle kodefragmenterne vist i afsnit 3 og 4.

Før parsing og test er vi nødt til at initialisere den statiske variabel, der er angivet lige ovenfor, og generere hvile-med-spring.docx filen i den aktuelle arbejdsmappe ved at påkalde håndtagSimpleDoc metode:

@BeforeClass offentlig statisk tomrum generereMSWordFile () kaster undtagelse {WordTest.wordDocument = nyt WordDocument (); wordDocument.handleSimpleDoc (); }

Lad os gå videre til det sidste trin: parsing af MS Word-filen og verifikation af resultatet.

5.2. Analyse af MS Word-fil og verifikation

Først udtrækker vi indhold fra den givne MS Word-fil i projektmappen og gemmer indholdet i en Liste af XWPFParagraph:

Sti msWordPath = Paths.get (WordDocument.output); XWPFDocument-dokument = nyt XWPFDocument (Files.newInputStream (msWordPath)); Liste afsnit = document.getParagraphs (); document.close ();

Lad os derefter sikre os, at indholdet og stilen på titlen er den samme som det, vi har indstillet før:

XWPFParagraph title = paragraphs.get (0); XWPFRun titleRun = title.getRuns (). Get (0); assertEquals ("Byg din REST API med Spring", title.getText ()); assertEquals ("009933", titleRun.getColor ()); assertTrue (titleRun.isBold ()); assertEquals ("Courier", titleRun.getFontFamily ()); assertEquals (20, titleRun.getFontSize ());

Af hensyn til enkelheden validerer vi bare indholdet af andre dele af filen og udelader typografierne. Verifikationen af ​​deres stilarter svarer til det, vi har gjort med titlen:

assertEquals ("fra HTTP-grundlæggende til API-mestring", afsnits.get (1) .getText ()); assertEquals ("Hvad gør en god API?", afsnits.get (3) .getText ()); assertEquals (wordDocument.convertTextFileToString (WordDocument.paragraph1), paragraphs.get (4) .getText ()); assertEquals (wordDocument.convertTextFileToString (WordDocument.paragraph2), paragraphs.get (5) .getText ()); assertEquals (wordDocument.convertTextFileToString (WordDocument.paragraph3), paragraphs.get (6) .getText ());

Nu kan vi være sikre på, at oprettelsen af hvile-med-spring.docx filen har været vellykket.

6. Konklusion

Denne tutorial introducerede Apache POI-support til Microsoft Word-format. Det gennemgik de nødvendige trin for at generere en MS Word-fil og for at kontrollere dens indhold.

Implementeringen af ​​alle disse eksempler og kodestykker kan findes i et GitHub-projekt.