Microsoft Word Processing i Java med Apache POI
1. Oversikt
Apache POI er et Java-bibliotek for å jobbe med de forskjellige filformatene basert på Office Open XML-standarder (OOXML) og Microsofts OLE 2 Compound Document-format (OLE2).
Denne opplæringen fokuserer på støtten til Apache POI for Microsoft Word, det mest brukte Office-filformatet. Den går gjennom trinnene som trengs for å formatere og generere en MS Word-fil og hvordan du analyserer denne filen.
2. Maven-avhengigheter
Den eneste avhengigheten som kreves for at Apache POI skal håndtere MS Word-filer, er:
org.apache.poi poi-ooxml 3.15
Klikk her for den nyeste versjonen av denne gjenstanden.
3. Klargjøring
La oss nå se på noen av elementene som brukes til å lette genereringen av en MS Word-fil.
3.1. Ressursfiler
Vi samler innholdet i tre tekstfiler og skriver dem inn i en MS Word-fil - med navnet hvile-med-våren.docx.
i tillegg logo-leaf.png filen brukes til å sette inn et bilde i den nye filen. Alle disse filene finnes på klassestien og er representert av flere statiske variabler:
offentlig statisk strenglogo = "logo-leaf.png"; offentlig statisk streng avsnitt 1 = "poi-word-para1.txt"; offentlig statisk streng avsnitt2 = "poi-word-para2.txt"; offentlig statisk streng avsnitt3 = "poi-word-para3.txt"; offentlig statisk strengutgang = "rest-with-spring.docx";
For de som er nysgjerrige, blir innholdet av disse ressursfilene i depotet, hvis lenke er gitt i den siste delen av denne veiledningen, hentet fra denne kurssiden her på siden.
3.2. Hjelpermetode
Hovedmetoden som består av logikk som brukes til å generere en MS Word-fil, som er beskrevet i følgende avsnitt, bruker en hjelpemetode:
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 metoden trekker ut innholdet i en tekstfil som ligger på klassestien, hvis navn er sendt inn String argument. Deretter sammenkobles linjene i denne filen og returnerer sammenføyningen String.
4. Generering av MS Word-filer
Denne delen gir instruksjoner om hvordan du formaterer og genererer en Microsoft Word-fil. Før vi arbeider med en hvilken som helst del av filen, må vi ha en XWPFDokument forekomst:
XWPFDocument-dokument = nytt XWPFDocument ();
4.1. Formatering av tittel og undertekst
For å lage tittelen, må vi først instansiere XWPFParagraph klasse og angi justeringen på det nye objektet:
XWPFParagraph title = document.createParagraph (); title.setAlignment (ParagraphAlignment.CENTER);
Innholdet i et avsnitt må pakkes inn i et XWPFRun gjenstand. Vi kan konfigurere dette objektet til å angi en tekstverdi og tilhørende stiler:
XWPFRun titleRun = title.createRun (); titleRun.setText ("Bygg din REST API med våren"); titleRun.setColor ("009933"); titleRun.setBold (true); titleRun.setFontFamily ("Courier"); titleRun.setFontSize (20);
Man skal være i stand til å utlede formålene med settmetodene fra navnene deres.
På en lignende måte skaper vi en XWPFParagraph forekomst som vedlegger underteksten:
XWPFParagraph subTitle = document.createParagraph (); subTitle.setAlignment (ParagraphAlignment.CENTER);
La oss også formatere underteksten:
XWPFRun subTitleRun = subTitle.createRun (); subTitleRun.setText ("fra grunnleggende HTTP til API-mestring"); subTitleRun.setColor ("00CC44"); subTitleRun.setFontFamily ("Courier"); subTitleRun.setFontSize (16); subTitleRun.setTextPosition (20); subTitleRun.setUnderline (UnderlinePatterns.DOT_DOT_DASH);
De setTextPosition metoden angir avstanden mellom underteksten og det påfølgende bildet, mens setUnderline bestemmer understrekningsmønsteret.
Legg merke til at vi hardkoder innholdet i både tittel og undertekst, ettersom disse utsagnene er for korte til å rettferdiggjøre bruken av en hjelpemetode.
4.2. Sette inn et bilde
Et bilde må også pakkes inn i et XWPFParagraph forekomst. Vi vil at bildet skal være horisontalt sentrert og plassert under undertittelen, og følgende kodebit må derfor settes under koden ovenfor:
XWPFParagraph image = document.createParagraph (); image.setAlignment (ParagraphAlignment.CENTER);
Slik angir du avstanden mellom dette bildet og teksten under det:
XWPFRun imageRun = image.createRun (); imageRun.setTextPosition (20);
Et bilde blir tatt fra en fil på klassestien og deretter satt inn i MS Word-filen med de angitte dimensjonene:
Path 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 av avsnitt
Slik lager vi første avsnitt med innhold hentet fra poi-word-para1.txt fil:
XWPFParagraph para1 = document.createParagraph (); para1.setAlignment (ParagraphAlignment.BOTH); Strengstreng1 = convertTextFileToString (avsnitt 1); XWPFRun para1Run = para1.createRun (); para1Run.setText (streng1);
Det er tydelig at opprettelsen av et avsnitt ligner på opprettelsen av tittelen eller undertittelen. Den eneste forskjellen her er bruken av hjelpemetoden i stedet for hardkodede strenger.
På en lignende måte kan vi lage to andre avsnitt ved hjelp av innhold fra filer poi-word-para2.txt og poi-word-para3.txt:
XWPFParagraph para2 = document.createParagraph (); para2.setAlignment (ParagraphAlignment.RIGHT); Strengstreng2 = convertTextFileToString (avsnitt2); XWPFRun para2Run = para2.createRun (); para2Run.setText (streng2); para2Run.setItalic (true); XWPFParagraph para3 = document.createParagraph (); para3.setAlignment (ParagraphAlignment.LEFT); Strengstreng3 = convertTextFileToString (avsnitt 3); XWPFRun para3Run = para3.createRun (); para3Run.setText (string3);
Opprettelsen av disse tre avsnittene er nesten den samme, bortsett fra noen styling som justering eller kursiv.
4.4. Genererer MS Word-fil
Nå er vi klare til å skrive ut en Microsoft Word-fil til minnet fra dokument variabel:
FileOutputStream ut = ny FileOutputStream (utgang); document.write (ut); ut. lukk (); document.close ();
Alle kodebitene i denne delen er pakket inn i en metode som heter håndtakSimpleDoc.
5. Analyse og testing
Denne delen skisserer analysering av MS Word-filer og bekreftelse av resultatet.
5.1. Forberedelse
Vi erklærer et statisk felt i testklassen:
statisk WordDocument wordDocument;
Dette feltet brukes til å referere til en forekomst av klassen som omslutter alle kodefragmentene vist i seksjoner 3 og 4.
Før parsing og testing, må vi initialisere den statiske variabelen deklarert rett ovenfor og generere hvile-med-våren.docx filen i gjeldende arbeidskatalog ved å påkalle håndtakSimpleDoc metode:
@BeforeClass offentlig statisk tomrom generereMSWordFile () kaster unntak {WordTest.wordDocument = nytt WordDocument (); wordDocument.handleSimpleDoc (); }
La oss gå videre til det siste trinnet: parsing av MS Word-filen og verifisering av resultatet.
5.2. Analyse av MS Word-fil og bekreftelse
Først trekker vi ut innholdet fra den gitte MS Word-filen i prosjektkatalogen og lagrer innholdet i en Liste av XWPFParagraph:
Sti msWordPath = Paths.get (WordDocument.output); XWPFDocument-dokument = nytt XWPFDocument (Files.newInputStream (msWordPath)); Liste avsnitt = document.getParagraphs (); document.close ();
La oss deretter sørge for at innholdet og stilen på tittelen er den samme som vi har satt før:
XWPFParagraph title = paragraphs.get (0); XWPFRun titleRun = title.getRuns (). Get (0); assertEquals ("Bygg din REST API med Spring", title.getText ()); assertEquals ("009933", titleRun.getColor ()); assertTrue (titleRun.isBold ()); assertEquals ("Courier", titleRun.getFontFamily ()); assertEquals (20, titleRun.getFontSize ());
For enkelhets skyld validerer vi bare innholdet i andre deler av filen, og utelater stilene. Bekreftelsen av stilene deres ligner på det vi har gjort med tittelen:
assertEquals ("fra HTTP-grunnleggende til API-mestring", avsnitts.get (1) .getText ()); assertEquals ("Hva gjør en god API?", avsnitts.get (3) .getText ()); assertEquals (wordDocument.convertTextFileToString (WordDocument.paragraph1), avsnitts.get (4) .getText ()); assertEquals (wordDocument.convertTextFileToString (WordDocument.paragraph2), avsnitts.get (5) .getText ()); assertEquals (wordDocument.convertTextFileToString (WordDocument.paragraph3), paragraphs.get (6) .getText ());
Nå kan vi være sikre på at etableringen av hvile-med-våren.docx filen har vært vellykket.
6. Konklusjon
Denne opplæringen introduserte Apache POI-støtte for Microsoft Word-format. Det gikk gjennom trinnene som trengs for å generere en MS Word-fil og for å verifisere innholdet.
Implementeringen av alle disse eksemplene og kodebiter kan bli funnet i et GitHub-prosjekt.