Microsoft Word Processing in Java mit Apache POI

1. Überblick

Apache POI ist eine Java-Bibliothek zum Arbeiten mit den verschiedenen Dateiformaten, die auf den Office Open XML-Standards (OOXML) und dem OLE 2-Verbunddokumentformat (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 führt Sie durch die Schritte, die zum Formatieren und Generieren einer MS Word-Datei und zum Analysieren dieser Datei erforderlich sind.

2. Abhängigkeiten von Maven

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

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.15</version>
</dependency>

Klicken Sie auf hier ]Version dieses Artefakts.

3. Vorbereitung

Schauen wir uns nun einige Elemente an, die die Erzeugung einer MS Word-Datei erleichtern.

3.1. Ressourcendateien

Wir sammeln den Inhalt von drei Textdateien und schreiben sie in eine MS-Word-Datei namens rest-with-spring.docx .

Außerdem 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 Neugierige werden die Inhalte dieser Ressourcendateien im Repository, deren Link im letzten Abschnitt dieses Tutorials angegeben ist, aus dem folgenden Link extrahiert:/rest-with-spring-course?[diese Kursseite]hier auf der Website.

3.2. Hilfsmethode

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

public String convertTextFileToString(String fileName) {
    try (Stream<String> stream
      = Files.lines(Paths.get(ClassLoader.getSystemResource(fileName).toURI()))) {

        return stream.collect(Collectors.joining(" "));
    } catch (IOException | URISyntaxException e) {
        return null;
    }
}

Diese Methode extrahiert Inhalte aus einer Textdatei, die sich im Klassenpfad befindet und deren Name das übergebene Argument String ist. Dann verkettet es Zeilen in dieser Datei und gibt den verbundenen String zurück.

4. MS Word-Dateierzeugung

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

XWPFDocument document = new XWPFDocument();

4.1. Formatieren von Titel und Untertitel

Um den Titel zu erstellen, müssen Sie zunächst die Klasse XWPFParagraph 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 Set-Methoden aus ihren Namen abzuleiten.

Auf ähnliche Weise erstellen wir eine XWPFParagraph -Instanz, die den Untertitel einschließt:

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

Formatieren Sie 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 Methode setTextPosition legt den Abstand zwischen dem Untertitel und dem nachfolgenden Bild fest, während setUnderline das Unterstreichungsmuster bestimmt.

Beachten Sie, dass wir den Inhalt sowohl des Titels als auch des Untertitels hart 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 der folgende Code unterhalb des oben angegebenen Codes platziert werden:

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

So legen Sie den Abstand zwischen diesem Bild und dem darunter liegenden Text fest:

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

Ein Bild wird aus einer Datei im Klassenpfad übernommen 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 ähnelt. Der einzige Unterschied besteht hier in der Verwendung der Hilfsmethode anstelle von hart codierten Zeichenketten.

Auf ähnliche Weise können wir zwei weitere Absätze erstellen, indem wir den Inhalt der Dateien poi-word-para2.txt und poi-word-para3.txt verwenden:

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 fast gleich, mit Ausnahme einiger Stilrichtungen wie Ausrichtung oder Kursiv.

4.4. MS Word-Datei generieren

Jetzt können wir eine Microsoft Word-Datei aus der document -Variable in den Speicher schreiben:

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

Alle Codeausschnitte in diesem Abschnitt werden in eine Methode namens handleSimpleDoc eingeschlossen.

5. Analysieren und Testen

In diesem Abschnitt wird die Analyse von MS Word-Dateien und die Überprüfung des Ergebnisses beschrieben.

5.1. Vorbereitung

Wir deklarieren ein statisches Feld in der Testklasse:

static WordDocument wordDocument;

Dieses Feld wird verwendet, um auf eine Instanz der Klasse zu verweisen, die alle in den Abschnitten 3 und 4 gezeigten Codefragmente einschließt.

Vor dem Analysieren und Testen müssen Sie die rechts oben deklarierte statische Variable initialisieren und die Datei rest-with-spring.docx im aktuellen Arbeitsverzeichnis generieren.

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

Fahren wir mit dem letzten Schritt fort: Analysieren der MS Word-Datei und Verifizieren des Ergebnisses

5.2. Parsen von MS Word-Dateien und Überprüfung

Zuerst extrahieren wir Inhalte aus der angegebenen MS Word-Datei im Projektverzeichnis und speichern die Inhalte in einer List von XWPFParagraph :

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

Als Nächstes stellen wir sicher, dass Inhalt und Stil des Titels dem entsprechen, den wir zuvor festgelegt haben:

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());

Der Einfachheit halber überprüfen wir nur den Inhalt anderer Teile der Datei und lassen die Stile aus. Die Überprüfung ihrer Stile ist ähnlich wie bei dem Titel:

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());

Jetzt können wir sicher sein, dass die Erstellung der Datei rest-with-spring.docx erfolgreich war.

6. Fazit

In diesem Lernprogramm wurde die Unterstützung von Apache POI für das Microsoft Word-Format eingeführt. Es wurden die erforderlichen Schritte zum Generieren einer MS Word-Datei und zum Überprüfen des Inhalts durchgeführt.

Die Implementierung all dieser Beispiele und Codeausschnitte finden Sie unter https://github.com/eugenp/tutorials/tree/master/apache-poi