Dokument - streng vertraulich!

Microsoft-Office-Dokumente mit Apache POI erzeugen und einlesen
Keine Kommentare

Allen Alternativen zum Trotz werden in der großen und weiten Unternehmenswelt weiterhin Daten, Dokumente und Dateien mit Microsoft Office erstellt, gespeichert, bearbeitet und ausgetauscht. Wenn Ihnen dieser einführende Satz bekannt vorkommt, erinnern Sie sich möglicherweise an die Einleitung eines schon etwas länger zurückliegenden Artikels von mir im Java Magazin [1]. Dieser Artikel behandelte Apache POI und Microsoft Excel. Statt um Worksheets, Zellen, Zeilen oder Charts geht es nun aber um das Erstellen und Einlesen von MS-Word-Dokumenten.

Sollten Sie den Artikel aus grauer JAXenter-Vorzeit jedoch nicht kennen oder sich nicht erinnern können, so soll hier gerne noch ein kurzer Abriss über Microsoft Office, Java und Apache POI erfolgen.

Apache POI ist eine Java-Bibliothek (Kasten: „Apache POI“), die Entwickler*innen dabei unterstützt, Daten in MS-Office-Dokumente zu schreiben, diese Dokumente zu manipulieren und auch auszulesen. Es handelt sich um ein Apache-Top-Level-Projekt. Auf der Projektseite [2] wird die Mission dieser Bibliothek damit beschrieben, ein Java API für die Manipulation verschiedener, auf dem Office-Open-XML-Standard OOXML (Kasten: „OOXML – Office Open XML“) und OLE2 von Microsoft basierender Dateien zur Verfügung zu stellen. Apache POI liefert diverse Komponenten-APIs, beispielsweise für Excel (HSSF/XSSF), PowerPoint (HSLW /XSLW) und Word (HWPF/XWPF), aber auch für Outlook, Visio oder den Publisher (Tabelle 1).

Komponente Beschreibung
POIFS Der älteste und stabilste Teil von Apache POI, auf dem alle Komponenten von Apache POI basieren, die nicht auf XML-basierte Microsoft Office-Dokumente zugreifen
HSSF Implementierung für Dokumente im Excel-97-2007-Dateiformat
XSSF Implementierung für Dokumente im Excel-2007-OOXML-Dateiformat
HWPF Implementierung für Dokumente im Word-97-2007-Dateiforma
XWPF Implementierung für Dokumente im Word-2007-OOXML-Dateiformat
HSLF Implementierung für Dokumente im Powerpoint-97-2007-Dateiformat
XSLF Implementierung für Dokumente im Powerpoint-2007-OOXML-Dateiformat
HSPF Implementierung für die Manipulation von OLE-2-Attributen eines Dokuments (Titel, Autor etc.)
HDGF Rudimentäre Implementierung für Dokumente im Visio-97-2003-Dateiformat
HPBF Rudimentäre Implementierung für Dokumente im Publisher-97-2003-Dateiformat
HMEF Implementierung für das TNEF-(Transport-Neutral-Encoding-Format-)Dateiformat
HSMF Rudimentäre Implementierung des Office-Nachrichten-Formats

Mit Microsoft Office erstellte und bearbeitete Dokumente stellen auch heute, im Jahr 2020, noch den Großteil der Unternehmensdokumentation dar – SharePoint-Nutzer*innen werden zustimmend nicken – und das allen Installationen von Confluence oder diversen Wiki-Varianten zum Trotz. In der .NET-Welt gestaltet sich die Arbeit weiterhin recht einfach, es existieren diverse Tutorials und Beispiele, um mit C# oder auch VB.NET Dokumente zu manipulieren.

Unter den auf der Projektseite referenzierten Case Studies [3] ist weiterhin ein Projekt der Deutschen Bahn prominent vertreten. Hierbei wurde ein alter Dokumentenbestand ausgelesen, um ihn weiter nutzen zu können. Interessanterweise ist es auf dem ersten Blick auch das einzige Projekt, das die HWPF-Komponente verwendet hat. Ein Blick in die Komponentenübersicht [4] verrät den möglichen Grund dafür.

Die Dokumentationslage ist im Vergleich zu den Excel-Komponenten sehr dünn, insbesondere was XWPF betrifft. Alles rund um Excel ist deutlich umfangreicher dokumentiert, sogar für PowerPoint scheint auf den ersten Blick mehr Dokumentation vorzuliegen.

Jetzt sind bereits mehrfach die Begriffe HPWF und XWPF gefallen – was ist nun aber der Unterschied? HWPF wurde bereitgestellt, um Microsoft-Word-97-2007-Dokumente zu erzeugen und einzulesen, im Gegensatz zu XWPF, das das OOXML-Format unterstützt (erkennbar an der Dateiendung *.docx, das Word-Dokumente seit Word 2007 innehaben). Dieser Artikel wird sich auf XWPF beschränken, da dieses den seit 14 Jahren bestehenden OOXML-Standard implementiert und davon auszugehen ist, dass der Großteil an Word-basierter Unternehmensdokumentation mittlerweile in dieser „modernen“ Zeit angekommen sein sollte. Man kann jedoch nicht ausschließen, dass auf irgendwelchen Netzlaufwerken noch Dokumentationsschätze aus den späten Neunzigern des vergangenen Jahrhunderts schlummern und darauf warten, eingelesen zu werden. In diesem Fall wird sich sicher jemand finden, der darüber einen Artikel schreiben möchte.

Womit fangen wir an?

Zunächst benötigt man für sein neues Projekt die entsprechende Bibliothek, um Apache POI verwenden zu können (siehe Auszug aus pom.xml in Listing 1). Sowohl zum Schreiben als auch zum Einlesen von .docx-Dokumenten ist das poi-ooxml-Artefakt ausreichend. Für das Handling von nicht Ooxml-basierten Dokumenten wäre zusätzlich das Hinzufügen des allgemeinen POI-Artefakts notwendig. Mit den genannten Dependencies ist es darüber hinaus u. a. auch möglich, MS-Excel-Dokumente zu erstellen und zu bearbeiten. Im Rahmen dieses Artikels wird zunächst ein Word-Dokument mit Hilfe von Apache POI und XWPF erzeugt und anschließend wieder eingelesen. Die Beispiele sind bewusst einfach gehalten und sollen einen Einstieg in die Thematik bieten. Die Hürde, auf dieser Grundlage eigene anforderungsspezifische Anwendungen zu implementieren, ist auf jeden Fall nicht sehr hoch.

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

WordprocessingML

Bevor mit dem Erstellen von .docx-Dokumenten begonnen werden kann, ist noch etwas graue Theorie notwendig. MS-Word-Textverarbeitungsdateien nach OOMXL-Standard werden mit der sogenannten WordProcessingML beschrieben. WordProcessingML ist erst einmal eine XML-basierte Auszeichnungssprache für Textdokumente, und vieles, was wir in der Definition eines .docx-Dokuments sehen, spiegelt sich bei der Benutzung von Apache POI wider. Es ist ein Bestandteil von OOXML (ebenso wie SpreadsheetML für MS-Excel-Dokumente sowie PresentationML für MS-PowerPoint-Präsentationen). Wie beispielsweise eine HTML-Seite, besteht ein solches Dokument zunächst aus einem Body, der wiederum aus einem oder mehreren Absätzen (Paragraphs) besteht. Im Folgenden werden Paragraphs, Paragraphen und Absätze synonym behandelt. Ein Absatz bzw. Paragraph enthält einen oder mehrere sogenannte Runs, die einen Textbereich beinhalten, wobei der dort enthaltene Text vielfältig formatiert werden kann.

Einen spezifischen Überblick über die WordprocessingML bietet [5], eine vollständige Übersicht oder gar nur Zusammenfassung würde an dieser Stelle den Rahmen sprengen. Bis auf eine Ausnahme wird es daher aus ebendiesem Grund auch keine Codebeispiele in WordprocessingML geben. Es ist allerdings wichtig, sich vor Augen zu führen, was man erzeugt, wenn man Apache POI nutzt, um Word-Dokumente zu erzeugen.

Schreiben von Word-Dateien

Ein sogenanntes XWPF-Dokument ist eine Instanz der Klasse XWPFDocument. Hierbei handelt es sich um eine High-Level-Klasse zum Bearbeiten von .docx-Dokumenten. Das JavaDoc der Klasse enthält folgenden interessanten Passus:

„This class tries to hide some of the complexity of the underlying file format, but as it’s not a mature and stable API yet, certain parts of the XML structure come through. You’ll therefore almost certainly need to refer to the OOXML specifications from http://www.ecma-international.org/publications/standards/Ecma-376.htm at some point in your use.“ [6]

Es lohnt sich hier also, sehr vorsichtig zu sein, und ggf. je nach Anwendungsfall tatsächlich die konkrete OOXML-Spezifikation bzw. WordprocessingML zu Rate zu ziehen.

Apache POI
Wofür steht Apache POI überhaupt? Der Name stand ursprünglich als Abkürzung für „Poor Obfuscation Implementation“. Man hielt den ironischen Grundton bei, die HSSF-Komponente für Excel-Dateien bedeutet so viel wie „Horrible Spreadsheet Format“. Wofür das Word-spezifische HWPF-Format steht, wird nicht direkt erklärt, man kann es sich aber durchaus herleiten.

OOXML – Office Open XML
Office Open XML ist ein XML-basiertes Format für Office-Dokumente. Dieses Format ist eine von Microsoft entwickelte Spezifikation und wurde von Ecma International 006 erstmalig standardisiert [6]. Hierbei sei jedoch der Hinweis gestattet, dass Office Open XML nicht mit Open Office bzw. dem Open-Document-Format zu verwechseln ist.

In erster Linie bestehen XWPF-Dokumente aus einzelnen Absätzen (Paragraphen), die einen Abschnitt eines Dokuments widerspiegeln, dargestellt durch Instanzen der XWPFParagraph-Klasse. Ein Absatz kann dabei vieles beinhalten, vom Seitenheader über Tabelle bis hin zu einem Bild oder einfach einem trivialen Textabschnitt. Für Paragraphen stehen viele Properties zur Verfügung, so zum Beispiel Textausrichtung, Angaben zu Einrückungen oder Spacing und Borders. Ein Paragraph besteht aus einer oder mehreren XWPFRun-Instanz(en) und beinhaltet nicht den eigentlichen Text mit seiner Formatierung, die ihrerseits in einem oder mehreren XWPFRuns hinterlegt wird.

Als Beispiel sollen die ersten paar Zeilen des Artikels, den Sie in genau diesem Moment lesen, mit Apache POI erzeugt werden. Daraus ergeben sich für den Code folgende Anforderungen:

  • Eine Head mit dem Font Arial in der Größe 18 pt

  • Eine Subhead mit dem Font Arial in der Größe 12 pt mit Einrückung

  • Der Autorenname, im Font Times New Roman in der Größe 10 pt und bold

  • Ein Mengentext in Times New Roman in der Größe 10 pt mit Einrückung

  • Eine Tabelle mit zwei Spalten

Beginnend mit dem Java-Code in Listing 2 soll nun ein Dokument entsprechend diesen Anforderungen erzeugt werden. Zunächst (Listing 2, Abschnitt #1) wird eine Instanz vom Typ XWPFDocument erzeugt, diese Instanz bekommt den sprechenden Namen artikel. Wie bereits angedeutet, besteht ein XWPFDokument (ein WordprocessingML Body) aus mehreren XWPFParagraph-Objekten (WordprocessingML-Absätzen), sodass zuerst eine Instanz header, die die Überschrift des Artikels darstellt, erzeugt wird. Dieser Paragraph soll zentriert im Dokument angezeigt werden (Listing 2, Abschnitt #2).

public void createXWPFDocument() {
  //(1)
  XWPFDocument artikel = new XWPFDocument();
  //(2)
  XWPFParagraph header = artikel.createParagraph();
  header.setAlignment(ParagraphAlignment.CENTER);
  //(3)
  XWPFRun headerRun = header.createRun();
  headerRun.setText("Dokument - Streng vertraulich!");
  headerRun.setFontFamily("ARIAL");
  headerRun.setFontSize(18);
  (...)

Ab Abschnitt #3 in Listing 2 wird nun ein sogenannter XWPFRun erzeugt – diese Runs beschreiben, wie bereits angemerkt, den Inhalt eines XWPFParagraph mit einem Satz von Properties zur Formatierung. Diese hier erzeugte Textregion headerRun soll den Titel des Artikels tragen – „Dokument – streng vertraulich“. Das weitere Verwenden der Properties Font und FontSize ist selbsterklärend.

XWPFRun-Instanzen bieten mannigfaltige Möglichkeiten zur Gestaltung von Dokumenten bzw. Texten, hier können nur einige Beispiele genannt werden:

  • Es können Tabulatoren oder Carriage Returns hinzugefügt werden.

  • Die Ausgabe von Bildern (XWPFPicture) wird ermöglicht.

  • Charts (org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline) können mit addChart() hinzugefügt werden.

  • Mit setText() kann natürlich auch ein Text angegeben werden.

  • Diverse Formatierungsoptionen über bold, color, italic, underline bis strikethrough werden angeboten.

Interessant wird es nun in der ersten Hälfte von Listing 3 – zuerst wird ein neuer Absatz subHeader erzeugt, für den das Alignment BOTH (Blocktext) angenommen wird (Listing 3, Abschnitt #4). Weitere Varianten sind z. B. CENTER, LEFT, RIGHT etc.

(...)
XWPFParagraph subHeader = artikel.createParagraph();
//(4)
subHeader.setAlignment(ParagraphAlignment.BOTH);
//(5)
subHeader.setIndentationFirstLine(500);
XWPFRun subHeaderRun = subHeader.createRun();
subHeaderRun.setText("Allen Alternativen zum Trotz (...)");
subHeaderRun.setFontFamily("ARIAL");
subHeaderRun.setFontSize(12);

Spannend ist auch die Zeile subHeader.setIndentationFirstLine(500);, die auf das XWPFParagraph-Objekt someText1 angewendet wird, denn es war nicht intuitiv klar, wie nun der Parameter für diesen Setter genau lauten soll. Die 500 ergab sich auch lediglich durch Ausprobieren im Rahmen der Recherchen für diesen Artikel als Zielwert, da Werte wie 1, 5, 10 zunächst keinen sichtbaren Erfolg im am Ende erzeugten Dokument hervorbrachten. Erst ein Nachlesen in Kapitel 17.3.1.12 (Paragraph Indentation) in der Sprachreferenz von OOXML [5] brachte Licht ins Dunkel: Innerhalb von OOXML ist die Paragraph-Indentation (Einrückung) durch die WordprocessingML definiert, und ein Beispiel ist wie in Listing 4 niedergeschrieben. Dieses Beispiel entstammt direkt [5], hierbei sollen sowohl rechts wie links eines Textes jeweils 1440-mal das Zwanzigstel eines Punkts als Einrückung verwendet werden, wobei 1140 Twips = 1 Inch und 567 Twips = 1 Zentimeter darstellen. Darauf muss man erstmal kommen, wenn man die Sprachreferenz nicht kennt! Es ist dennoch mit sehr viel Rumrätseln sowie Trial and Error verbunden, und man wird nicht umhinkommen, einige Dokumente zu erzeugen, bis das gewünschte Ergebnis vorliegt.

Siehe [5]
<w:pPr> 
  <w:ind w:start="1440" w:end="1440"/> 
</w:pPr> 

Der Paragraph authorName ist nun nur noch Fleißarbeit, es wird die FontFamily auf TIMES NEW ROMAN gesetzt und die Methode setBold() mit dem Argument true aufgerufen (Listing 5, Abschnitt #7). Ebenso gestaltet es sich bei dem Mengentext, wobei hier wie beim subHead eine Einrückung zu berücksichtigen ist. Listing 6 beschreibt nunmehr, wie man eine Tabelle erzeugen kann (Kasten: „Anmerkung des Autors“). Zunächst wird eine Instanz vom Typ XWPFTable erzeugt, indem man die createTable-Funktion des übergeordneten XWPFDocument-Objekts aufruft, im Beispiel mit den Argumenten 4 und 2 (4 Zeilen, 2 Spalten). Dann werden für alle Zeilen und Spalten für die jeweilige Zelle passende Inhalte eingefügt. Schließlich muss nur noch das Dokument als solches erzeugt werden, wie in Listing 7 zu sehen. Dazu wird ein FileOutputStream verwendet. Führt man die Implementierung nun aus, wird man am Ende mit einer .docx-Datei belohnt, die man in Word nun öffnen, bewundern und auch weiterbearbeiten kann (Abb. 1).

//(7)
XWPFParagraph authorName = artikel.createParagraph();
authorName.setAlignment(ParagraphAlignment.LEFT);
XWPFRun authorNameRun = authorName.createRun();
authorNameRun.setText("von Andreas Monschau");
authorNameRun.setFontFamily("TIMES NEW ROMAN");
authorNameRun.setFontSize(10);
authorNameRun.setBold(true);
XWPFTable table = artikel.createTable(4, 2);
table.setTableAlignment(TableRowAlign.CENTER);
 
XWPFTableRow tableHeaderRow = table.getRow(0);
XWPFTableCell headerCellLeft = tableHeaderRow.getCell(0);
headerCellLeft.setText("Komponente");
XWPFTableCell headerCellRight = tableHeaderRow.getCell(1);
headerCellRight.setText("Beschreibung");
 
XWPFTableRow firstDataRow = table.getRow(1);
XWPFTableCell firstDataRowLeft = firstDataRow.getCell(0);
firstDataRowLeft.setText("HSSF");
XWPFTableCell firstDataRowRight = firstDataRow.getCell(1);
firstDataRowRight.setText("Implementierung für Dokumente im Excel 97-2007 Datei-Format.");
(...)
(...)
FileOutputStream out = new FileOutputStream(output);
artikel.write(out);
out.close();
artikel.close();
(...)
Abb. 1: Die erzeugte docx-Datei

Abb. 1: Die erzeugte docx-Datei

Anmerkung des Autors
Ich habe die Beispiele unter MacOS entwickelt, und dort verwende ich Pages als Textverarbeitungsprogramm. Pages scheint weitestgehend kompatibel zu sein, ich konnte die meisten Ergebnisse auch direkt dort nachvollziehen. Bei den Tabellen jedoch war mir kein Glück beschert, denn Pages wollte sie mir partout nicht korrekt anzeigen. Mir blieb nur das Öffnen mit einem „echten“ Word, und als Lohn meiner Arbeit prangte mir schließlich auch eine formschöne Tabelle entgegen.

Einlesen von Word-Dateien

Nachdem das .docx-Dokument erstellt wurde, wird es nun Zeit, sich mit dem Einlesen bzw. Parsen eben solcher Dateien zu beschäftigen. Ein wahrscheinliches Szenario, das das Einlesen via Apache POI erfordert, dürfte wohl sein, die Inhalte großer Mengen von Word-Dokumenten auf einem Netzlaufwerk oder auf einer lokalen Partition in eine oder mehrere Datenbanktabellen zu überführen. Als konkretes Beispiel soll das im ersten Teil dieses Artikels erzeugte Dokument wieder eingelesen werden. Der Einfachheit halber werden die Inhalte direkt per System.out.println() auf der Standardkonsole ausgegeben. In einer produktiven Umgebung hätte man hier z. B. die Gelegenheit, die Daten in eine oder mehrere Datenbanktabelle(n) zu schreiben oder in anderer, geeigneter Form zu verarbeiten.

Zunächst wird das Dokument als FileInputStream eingelesen. Das geschieht über die statische open()-Funktion aus der Klasse OPCPackage. Erzeugt wird daraus eine Instanz vom Typ XWPFDocument (Listing 8). Es stehen nun zwei Wege zum Auslesen des Dokuments offen: Eine Möglichkeit ist es, die Klasse XWPFWordExtractor zu verwenden. Hierbei handelt es sich um eine Hilfsklasse, die das schnelle Auslesen von OOXML-Word-Dokumenten erlaubt. Listing 9 zeigt, wie es mit zwei schnellen Zeilen zu implementieren ist. In diesem Fall wird jedoch der gesamte Inhalt in einem Rutsch auf der Konsole ausgegeben, was ggf. nicht gewünscht ist (es sei denn, man möchte die ganze Datei z. B. in ein Datenbankfeld vom Typ CLOB oder TEXT etc. speichern, dann ist es natürlich sinnvoll, die Daten direkt in die Datenbank zu pumpen).

(...)
XWPFDocument doc = new XWPFDocument(OPCPackage.open(new FileInputStream(...)));
(...)
(...)
XWPFWordExtractor wordExtractor = new XWPFWordExtractor(doc);
System.out.println(wordExtractor.getText());
(...)

Alternativ kann man sich auch die einzelnen Textabschnitte in Form von XWPFParagraph-Instanzen einlesen, womit sich das einzulesende Dokument in kleinere, leichter zu bearbeitende Teile splitten lässt. Listing 10, Abschnitt #8 zeigt, dass hierzu über eine Liste von XWPFParagraph iteriert wird. Die Anzahl dieser Abschnitte entspricht exakt der Anzahl jener, die beim Erzeugen des Dokuments verwendet worden sind. Aus dem erzeugten XWPFParagraph-Objekt kann nun (Listing 10, Abschnitt #9) mit getText() der Inhalt ermittelt werden, mit getIndentationFirstLine() der Wert für die Einrückung (der Wert -1 deutet darauf hin, dass für die Einrückung bei der Erzeugung des Paragraphen kein entsprechender Wert gesetzt wurde) sowie mit getAlignment() die Ausrichtung, im Fall der Überschrift CENTER, wie auch in Listing 2, Abschnitt #2 zu sehen ist. Indem über die Runs des Paragraphen iteriert wird (Listing 10, Abschnitt #10), gelangt man auch zu den Formatierungsoptionen, in diesem Fall Font-Family sowie Font-Size. Abbildung 2 zeigt einen Ausschnitt aus der Ausgabe auf der Konsole. Hier lässt sich bereits erahnen, wie einfach es ist, sich die erforderlichen Inhalte und zugehörigen Informationen zu einem Paragraphen ermitteln zu lassen. Das Einlesen der Tabelle ist nunmehr reine Fingerübung, wird aber auch in Listing 11 dargestellt, wobei in diesem Fall bekannt ist, wie die Tabelle aufgebaut wurde, was beim Parsen einen nicht unerheblichen Vorteil gibt.

(...)
//(8)
List paragraphList = doc.getParagraphs();
  for (XWPFParagraph paragraph : paragraphList) {
    //(9)
    System.out.println(paragraph.getText());
 
    System.out.println(paragraph.getIndentationFirstLine());
    System.out.println(paragraph.getAlignment());
    //(10)
    for (XWPFRun run : paragraph.getRuns()) {
      System.out.println(run.getFontFamily());
      System.out.println(run.getFontSize());
    }
  }
  (...)
Abb. 2: Output des Inhalts der Datei auf der Konsole

Abb. 2: Output des Inhalts der Datei auf der Konsole

(...)
List tables = doc.getTables();
for (XWPFTable table : tables) {
  System.out.println(table.getNumberOfRows());
  for (XWPFTableRow row : table.getRows()) {
 
    System.out.print(row.getCell(0).getText());
    System.out.print("|");
    System.out.println(row.getCell(1).getText());
  }
}
(...)

Das Interface IBody

Eine Alternative zum beschriebenen Einlesen von Word-Dokumenten stellt auch das Interface IBody dar. IBody repräsentiert die vollständigen Inhalte eines Dokuments. Mit Hilfe von Iterator iBodyElements = doc.getBodyElementsIterator() wäre es beispielsweise möglich, sich alle IBody-Elemente eines XWPFDocument zu holen und darüber zu iterieren, um beispielsweise über instanceof an die einzelnen Elemente zu gelangen. Das ist auf jeden Fall sinnvoll, wenn die Struktur eines Dokuments im Vorfeld nicht bekannt ist und man einen generischeren Ansatz verfolgen will. IBody selbst ist relativ schwach dokumentiert, außer einem JavaDoc [7] liefert Apache da nicht viel, sodass man auf das Recherchieren im Netz angewiesen ist. Mit IBody bewegt man sich allerdings deutlich näher an den WordprocessingML-Gefilden, da sich hier die dort beschriebenen Strukturen direkt abbilden.

Fazit

XWPF bietet noch weitaus mehr Möglichkeiten, dieser Artikel kann natürlich nur einen kleinen Einblick liefern. So ist es unter anderem möglich, auch Header und Footer zu erzeugen (mit XWPFHeaderFooter), Bilder einzufügen oder auch einfach den Text eines Dokuments on the fly zu ändern. So lässt sich zum Beispiel auch ein verzeichnisweites Suchen und Ersetzen realisieren, wenn es nicht notwendig sein sollte, Dokumentinhalte zu persistieren, um sie anschließend wie auch immer geartet weiterzuverwenden.

Grundsätzlich kann man mit den Funktionalitäten, die Apache POI für das Arbeiten mit Word-Dokumenten liefert, ähnlich zufrieden sein wie mit der Anbindung von MS Excel. Auf jeden Fall ist der Einsatz sinnvoll, wenn man ganz konkret Textverarbeitungsdokumente im MS-Word-Format einlesen muss. Möchte man jedoch lediglich unspezifisch Dokumente erzeugen, die später auch nicht mehr weiterverarbeitet werden sollen, so kann man sich durchaus die Frage stellen, ob man nicht einfach PDF als Ausgabeformat wählt. Die XWPF-Fähigkeiten von Apache POI ermöglichen es auf jeden Fall, mit überschaubarem Aufwand docx-Dokumente zu erzeugen und auch einzulesen, was es – neben den Excel-Funktionalitäten der Bibliothek – zu einer mächtigen Ergänzung und einem Handwerkszeug für Java-Entwickler*innen macht, von dem man zumindest mal gehört haben sollte. Möchte man sich tiefer in die Gefilde von OOXML einarbeiten, wird man aber nicht umhinkommen, sich intensiv mit JavaDoc sowie WordprocessingML zu beschäftigen.


Links & Literatur

Unsere Redaktion empfiehlt:

Relevante Beiträge

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

avatar
400
  Subscribe  
Benachrichtige mich zu:
X
- Gib Deinen Standort ein -
- or -