Microsoft Textverarbeitung in Java mit Apache POI

1. Übersicht

Apache POI ist eine Java-Bibliothek für die Arbeit mit den verschiedenen Dateiformaten, die auf den Office Open XML-Standards (OOXML) und dem OLE 2 Compound Document-Format (OLE2) von Microsoft basieren.

Dieses Tutorial konzentriert sich auf die Unterstützung von Apache POI für Microsoft Word, dem am häufigsten verwendeten Office-Dateiformat. Es werden die Schritte zum Formatieren und Generieren einer MS Word-Datei sowie zum Parsen dieser Datei beschrieben.

2. Maven-Abhängigkeiten

Die einzige Abhängigkeit, die Apache POI für die Verarbeitung von MS Word-Dateien benötigt, ist:

 org.apache.poi poi-ooxml 3.15 

Klicken Sie hier, um die neueste Version dieses Artefakts anzuzeigen.

3. Vorbereitung

Schauen wir uns nun einige der Elemente an, die zur Erstellung einer MS Word-Datei verwendet werden.

3.1. Ressourcendateien

Wir werden den Inhalt von drei Textdateien sammeln und in eine MS Word-Datei mit dem Namen rest-with-spring.docx schreiben .

Darüber hinaus wird die Datei logo-leaf.png verwendet, um ein Bild in diese neue Datei einzufügen. Alle diese Dateien sind im Klassenpfad vorhanden und werden durch mehrere statische Variablen dargestellt:

public static String logo = "logo-leaf.png"; public static String paragraph1 = "poi-word-para1.txt"; public static String paragraph2 = "poi-word-para2.txt"; public static String paragraph3 = "poi-word-para3.txt"; public static String output = "rest-with-spring.docx";

Für diejenigen, die neugierig sind, wird der Inhalt dieser Ressourcendateien im Repository, dessen Link im letzten Abschnitt dieses Tutorials angegeben ist, von dieser Kursseite hier auf der Website extrahiert.

3.2. Hilfsmethode

Die Hauptmethode, die aus der Logik zum Generieren einer MS Word-Datei besteht, die im folgenden Abschnitt beschrieben wird, verwendet eine Hilfsmethode:

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

Diese Methode extrahiert Inhalte, die in einer Textdatei im Klassenpfad enthalten sind, deren Name das übergebene String- Argument ist. Anschließend werden die Zeilen in dieser Datei verkettet und der verknüpfte String zurückgegeben .

4. Generierung von MS Word-Dateien

Dieser Abschnitt enthält Anweisungen zum Formatieren und Generieren einer Microsoft Word-Datei. Bevor wir an einem Teil der Datei arbeiten können, benötigen wir eine XWPFDocument- Instanz:

XWPFDocument document = new XWPFDocument();

4.1. Formatieren von Titel und Untertitel

Um den Titel zu erstellen, müssen wir zuerst die XWPFParagraph- Klasse instanziieren und die Ausrichtung für das neue Objekt festlegen :

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

Der Inhalt eines Absatzes muss in ein XWPFRun- Objekt eingeschlossen werden. Wir können dieses Objekt so konfigurieren, dass ein Textwert und die zugehörigen Stile festgelegt werden:

XWPFRun titleRun = title.createRun(); titleRun.setText("Build Your REST API with Spring"); titleRun.setColor("009933"); titleRun.setBold(true); titleRun.setFontFamily("Courier"); titleRun.setFontSize(20);

Man sollte in der Lage sein, die Zwecke der Mengenmethoden aus ihren Namen abzuleiten.

In ähnlicher Weise erstellen wir eine XWPFParagraph- Instanz, die den Untertitel enthält:

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

Formatieren wir auch den Untertitel:

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

Die setTextPosition- Methode legt den Abstand zwischen dem Untertitel und dem nachfolgenden Bild fest, während setUnderline das Unterstreichungsmuster bestimmt.

Beachten Sie, dass wir den Inhalt von Titel und Untertitel fest codieren, da diese Anweisungen zu kurz sind, um die Verwendung einer Hilfsmethode zu rechtfertigen.

4.2. Einfügen eines Bildes

Ein Bild muss auch in eine XWPFParagraph- Instanz eingeschlossen werden. Wir möchten, dass das Bild horizontal zentriert und unter dem Untertitel platziert wird. Daher muss das folgende Snippet unter dem oben angegebenen Code platziert werden:

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

So stellen Sie den Abstand zwischen diesem Bild und dem Text darunter ein:

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

Ein Bild wird aus einer Datei im Klassenpfad entnommen und dann mit den angegebenen Abmessungen in die MS Word-Datei eingefügt:

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. Absätze formatieren

So erstellen wir den ersten Absatz mit Inhalten aus der Datei poi-word-para1.txt :

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

Es ist offensichtlich, dass die Erstellung eines Absatzes der Erstellung des Titels oder Untertitels ähnlich ist. Der einzige Unterschied besteht in der Verwendung der Hilfsmethode anstelle von fest codierten Zeichenfolgen.

In ähnlicher Weise können wir zwei weitere Absätze mit Inhalten aus den Dateien poi-word-para2.txt und poi-word-para3.txt erstellen :

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

Die Erstellung dieser drei Absätze ist bis auf einige Stile wie Ausrichtung oder Kursivschrift nahezu identisch.

4.4. MS Word-Datei generieren

Now we are ready to write out a Microsoft Word file to memory from the document variable:

FileOutputStream out = new FileOutputStream(output); document.write(out); out.close(); document.close();

All the code snippets in this section are wrapped in a method named handleSimpleDoc.

5. Parsing and Testing

This section outlines the parsing of MS Word files and verification of the result.

5.1. Preparation

We declare a static field in the test class:

static WordDocument wordDocument;

This field is used to reference to an instance of the class that encloses all the code fragments shown in sections 3 and 4.

Before parsing and testing, we need to initialize the static variable declared right above and generate the rest-with-spring.docx file in the current working directory by invoking the handleSimpleDoc method:

@BeforeClass public static void generateMSWordFile() throws Exception { WordTest.wordDocument = new WordDocument(); wordDocument.handleSimpleDoc(); }

Let's move on to the final step: parsing the MS Word file and the verification of the outcome.

5.2. Parsing MS Word File and Verification

First, we extract contents from the given MS Word file in the project directory and the store the contents in a List of XWPFParagraph:

Path msWordPath = Paths.get(WordDocument.output); XWPFDocument document = new XWPFDocument(Files.newInputStream(msWordPath)); List paragraphs = document.getParagraphs(); document.close();

Next, let's make sure that the content and style of the title is the same as what we have set before:

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

For the sake of simplicity, we just validate the contents of other parts of the file, leaving out the styles. The verification of their styles is similar to what we have done with the title:

assertEquals("from HTTP fundamentals to API Mastery", paragraphs.get(1).getText()); assertEquals("What makes a good API?", paragraphs.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());

Now we can be confident that the creation of the rest-with-spring.docx file has been successful.

6. Conclusion

In diesem Tutorial wurde die Apache POI-Unterstützung für das Microsoft Word-Format vorgestellt. Es wurden die Schritte durchlaufen, die zum Generieren einer MS Word-Datei und zum Überprüfen ihres Inhalts erforderlich sind.

Die Implementierung all dieser Beispiele und Codefragmente finden Sie in einem GitHub-Projekt.