Microsoft-tekstverwerking in Java met Apache POI

1. Overzicht

Apache POI is een Java-bibliotheek voor het werken met de verschillende bestandsindelingen op basis van de Office Open XML-standaarden (OOXML) en het OLE 2 Compound Document-formaat (OLE2) van Microsoft.

Deze tutorial richt zich op de ondersteuning van Apache POI voor Microsoft Word, het meest gebruikte Office-bestandsformaat. Het doorloopt de stappen die nodig zijn om een ​​MS Word-bestand te formatteren en te genereren en hoe dit bestand te ontleden.

2. Maven afhankelijkheden

De enige afhankelijkheid die vereist is voor Apache POI om MS Word-bestanden te verwerken, is:

 org.apache.poi poi-ooxml 3.15 

Klik hier voor de laatste versie van dit artefact.

3. Voorbereiding

Laten we nu eens kijken naar enkele elementen die worden gebruikt om het genereren van een MS Word-bestand te vergemakkelijken.

3.1. Bronbestanden

We verzamelen de inhoud van drie tekstbestanden en schrijven ze in een MS Word-bestand met de naam rest-met-lente.docx.

tevens de logo-leaf.png bestand wordt gebruikt om een ​​afbeelding in dat nieuwe bestand in te voegen. Al deze bestanden bestaan ​​op het klassenpad en worden vertegenwoordigd door verschillende statische variabelen:

openbare statische String logo = "logo-leaf.png"; public static String paragraph1 = "poi-word-para1.txt"; openbare statische String paragraaf2 = "poi-word-para2.txt"; openbare statische String paragraaf3 = "poi-word-para3.txt"; public static String output = "rest-with-spring.docx";

Voor degenen die nieuwsgierig zijn: de inhoud van deze bronbestanden in de repository, waarvan de link wordt gegeven in het laatste deel van deze tutorial, wordt uit deze cursuspagina hier op de site gehaald.

3.2. Helper-methode

De belangrijkste methode die bestaat uit logica die wordt gebruikt om een ​​MS Word-bestand te genereren, die wordt beschreven in de volgende sectie, maakt gebruik van een hulpmethode:

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

Deze methode extraheert de inhoud die zich bevindt in een tekstbestand dat zich op het klassenpad bevindt, waarvan de naam de doorgegeven is Draad argument. Vervolgens voegt het regels in dit bestand samen en retourneert het samenvoegen Draad.

4. Aanmaken van MS Word-bestanden

In dit gedeelte vindt u instructies voor het formatteren en genereren van een Microsoft Word-bestand. Voordat we aan een deel van het bestand kunnen werken, hebben we een XWPFDocument voorbeeld:

XWPFDocument document = nieuw XWPFDocument ();

4.1. Titel en ondertitel opmaken

Om de titel te maken, moeten we eerst het XWPFParagraaf class en stel de uitlijning in op het nieuwe object:

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

De inhoud van een alinea moet worden verpakt in een XWPFRun voorwerp. We kunnen dit object configureren om een ​​tekstwaarde en de bijbehorende stijlen in te stellen:

XWPFRun titleRun = title.createRun (); titleRun.setText ("Bouw je REST API met Spring"); titleRun.setColor ("009933"); titleRun.setBold (true); titleRun.setFontFamily ("Courier"); titleRun.setFontSize (20);

Het doel van de set-methoden zou uit hun namen moeten kunnen worden afgeleid.

Op een vergelijkbare manier maken we een XWPFParagraaf instantie die de ondertitel omsluit:

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

Laten we ook de ondertitel formatteren:

XWPFRun subTitleRun = subTitle.createRun (); subTitleRun.setText ("van HTTP-fundamentals tot API Mastery"); subTitleRun.setColor ("00CC44"); subTitleRun.setFontFamily ("Courier"); subTitleRun.setFontSize (16); subTitleRun.setTextPosition (20); subTitleRun.setUnderline (UnderlinePatterns.DOT_DOT_DASH);

De setTextPosition methode stelt de afstand in tussen de ondertitel en de volgende afbeelding, while setUnderline bepaalt het onderstrepingspatroon.

Merk op dat we de inhoud van zowel de titel als de ondertitel hard coderen, aangezien deze uitspraken te kort zijn om het gebruik van een hulpmethode te rechtvaardigen.

4.2. Een afbeelding invoegen

Een afbeelding moet ook worden verpakt in een XWPFParagraaf voorbeeld. We willen dat de afbeelding horizontaal gecentreerd is en onder de ondertitel wordt geplaatst, dus het volgende fragment moet onder de bovenstaande code worden geplaatst:

XWPFParagraph-afbeelding = document.createParagraph (); image.setAlignment (AlineaAlignment.CENTER);

Hier ziet u hoe u de afstand tussen deze afbeelding en de tekst eronder instelt:

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

Een afbeelding wordt genomen uit een bestand op het klassenpad en vervolgens ingevoegd in het MS Word-bestand met de opgegeven afmetingen:

Pad 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. Alinea's opmaken

Hier is hoe we de eerste alinea maken met inhoud uit de poi-word-para1.txt het dossier:

XWPFParagraph para1 = document.createParagraph (); para1.setAlignment (AlineaAlignment.BOTH); String string1 = convertTextFileToString (paragraaf1); XWPFRun para1Run = para1.createRun (); para1Run.setText (string1);

Het is duidelijk dat het maken van een alinea vergelijkbaar is met het maken van de titel of ondertitel. Het enige verschil hier is het gebruik van de helper-methode in plaats van hardgecodeerde strings.

Op een vergelijkbare manier kunnen we twee andere alinea's maken met inhoud uit bestanden poi-word-para2.txt en poi-word-para3.txt:

XWPFParagraph para2 = document.createParagraph (); para2.setAlignment (AlineaAlignment.RIGHT); String string2 = convertTextFileToString (paragraaf2); XWPFRun para2Run = para2.createRun (); para2Run.setText (string2); para2Run.setItalic (true); XWPFParagraph para3 = document.createParagraph (); para3.setAlignment (AlineaAlignment.LEFT); String string3 = convertTextFileToString (paragraaf3); XWPFRun para3Run = para3.createRun (); para3Run.setText (string3);

De creatie van deze drie alinea's is bijna hetzelfde, met uitzondering van enkele stijlen zoals uitlijning of cursief.

4.4. MS Word-bestand genereren

Nu zijn we klaar om een ​​Microsoft Word-bestand naar het geheugen te schrijven vanuit het document variabele:

FileOutputStream out = nieuwe FileOutputStream (output); document.write (uit); out.close (); document.close ();

Alle codefragmenten in deze sectie zijn verpakt in een methode met de naam handleSimpleDoc.

5. Ontleden en testen

In dit gedeelte wordt het ontleden van MS Word-bestanden en de verificatie van het resultaat beschreven.

5.1. Voorbereiding

We declareren een statisch veld in de testklasse:

statische WordDocument wordDocument;

Dit veld wordt gebruikt om te verwijzen naar een instantie van de klasse die alle codefragmenten bevat die worden weergegeven in secties 3 en 4.

Voordat we gaan parseren en testen, moeten we de statische variabele initialiseren die hierboven is aangegeven en het rust-met-lente.docx bestand in de huidige werkdirectory door de handleSimpleDoc methode:

@BeforeClass openbare statische leegte genererenMSWordFile () gooit Uitzondering {WordTest.wordDocument = nieuw WordDocument (); wordDocument.handleSimpleDoc (); }

Laten we verder gaan met de laatste stap: het MS Word-bestand ontleden en het resultaat verifiëren.

5.2. MS Word-bestand ontleden en verifiëren

Eerst halen we de inhoud uit het opgegeven MS Word-bestand in de projectdirectory en slaan we de inhoud op in een Lijst van XWPFParagraaf:

Pad msWordPath = Paths.get (WordDocument.output); XWPFDocument document = nieuw XWPFDocument (Files.newInputStream (msWordPath)); Lijst met paragrafen = document.getParagraphs (); document.close ();

Laten we er vervolgens voor zorgen dat de inhoud en stijl van de titel hetzelfde is als wat we eerder hebben ingesteld:

XWPFParagraph title = paragraafs.get (0); XWPFRun titleRun = title.getRuns (). Get (0); assertEquals ("Bouw je REST API met Spring", title.getText ()); assertEquals ("009933", titleRun.getColor ()); assertTrue (titleRun.isBold ()); assertEquals ("Courier", titleRun.getFontFamily ()); assertEquals (20, titleRun.getFontSize ());

Eenvoudigheidshalve valideren we alleen de inhoud van andere delen van het bestand, waarbij we de stijlen weglaten. De verificatie van hun stijlen is vergelijkbaar met wat we hebben gedaan met de titel:

assertEquals ("van HTTP-fundamentals tot API Mastery", paragraphs.get (1) .getText ()); assertEquals ("Wat maakt een goede API?", paragraphs.get (3) .getText ()); assertEquals (wordDocument.convertTextFileToString (WordDocument.paragraph1), paragraafs.get (4) .getText ()); assertEquals (wordDocument.convertTextFileToString (WordDocument.paragraph2), paragraphs.get (5) .getText ()); assertEquals (wordDocument.convertTextFileToString (WordDocument.paragraph3), paragraphs.get (6) .getText ());

Nu kunnen we erop vertrouwen dat de oprichting van de rest-met-lente.docx bestand is succesvol.

6. Conclusie

Deze tutorial introduceerde Apache POI-ondersteuning voor het Microsoft Word-formaat. Het heeft de nodige stappen doorlopen om een ​​MS Word-bestand te genereren en de inhoud ervan te verifiëren.

De implementatie van al deze voorbeelden en codefragmenten is te vinden in een GitHub-project.


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