ApachePOIを使用したJavaでのMicrosoftワードプロセッシング

1。概要

Apache POIは、Office Open XML標準(OOXML)およびMicrosoftのOLE 2複合ドキュメント形式(OLE2)に基づくさまざまなファイル形式を処理するためのJavaライブラリです。

このチュートリアルでは、最も一般的に使用されるOfficeファイル形式であるMicrosoftWord用のApachePOIのサポートに焦点を当てています。MS Wordファイルのフォーマットと生成に必要な手順と、このファイルの解析方法について説明します。

2.Mavenの依存関係

ApachePOIがMSWordファイルを処理するために必要な唯一の依存関係は次のとおりです。

 org.apache.poi poi-ooxml 3.15 

このアーティファクトの最新バージョンについては、ここをクリックしてください。

3.準備

ここで、MSWordファイルの生成を容易にするために使用される要素のいくつかを見てみましょう。

3.1。リソースファイル

3つのテキストファイルの内容を収集し、rest-with-spring.docxという名前のMSWordファイルに書き込みます。

さらに、logo-leaf.pngファイルは、その新しいファイルに画像を挿入するために使用されます。これらのファイルはすべてクラスパスに存在し、いくつかの静的変数で表されます。

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";

興味のある方のために、このチュートリアルの最後のセクションでリンクが示されているリポジトリ内のこれらのリソースファイルの内容は、このサイトのこのコースページから抽出されています。

3.2。ヘルパーメソッド

次のセクションで説明するMSWordファイルの生成に使用されるロジックで構成されるメインメソッドは、ヘルパーメソッドを使用します。

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; } }

このメソッドは、渡されたString引数という名前のクラスパスにあるテキストファイルに含まれるコンテンツを抽出します。次に、このファイルの行を連結し、結合している文字列を返します。

4. MSWordファイルの生成

このセクションでは、MicrosoftWordファイルをフォーマットおよび生成する方法について説明します。ファイルの任意の部分で作業する前に、XWPFDocumentインスタンスが必要です。

XWPFDocument document = new XWPFDocument();

4.1。タイトルとサブタイトルのフォーマット

タイトルを作成するには、最初にXWPFParagraphクラスをインスタンス化し、新しいオブジェクトの配置を設定する必要があります。

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

段落の内容は、XWPFRunオブジェクトでラップする必要があります。このオブジェクトを構成して、テキスト値とそれに関連するスタイルを設定できます。

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

その名前からset-methodsの目的を推測できるはずです。

同様の方法で、サブタイトルを囲むXWPFParagraphインスタンスを作成します。

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

字幕もフォーマットしましょう:

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

SETTEXTPOSITIONのながら方法は、字幕と後続の画像との間の距離を設定setUnderlineは下線パターンを決定します。

タイトルとサブタイトルの両方のコンテンツをハードコーディングしていることに注意してください。これらのステートメントは短すぎてヘルパーメソッドの使用を正当化できないためです。

4.2。画像の挿入

画像もXWPFParagraphインスタンスでラップする必要があります。画像を水平方向の中央に配置し、サブタイトルの下に配置する必要があるため、次のスニペットを上記のコードの下に配置する必要があります。

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

この画像とその下のテキストの間の距離を設定する方法は次のとおりです。

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

クラスパス上のファイルから画像が取得され、指定されたサイズでMSWordファイルに挿入されます。

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。段落の書式設定

poi-word-para1.txtファイルから取得した内容で最初の段落を作成する方法は次のとおりです。

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

段落の作成がタイトルまたはサブタイトルの作成に類似していることは明らかです。ここでの唯一の違いは、ハードコードされた文字列の代わりにヘルパーメソッドを使用することです。

同様の方法で、ファイルpoi-word-para2.txtおよびpoi-word-para3.txtのコンテンツを使用して、他の2つの段落を作成できます。

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

これらの3つの段落の作成は、配置や斜体などのスタイルを除いて、ほとんど同じです。

4.4。MSWordファイルの生成

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

このチュートリアルでは、MicrosoftWord形式のApachePOIサポートを紹介しました。MS Wordファイルを生成し、その内容を確認するために必要な手順を実行しました。

これらすべての例とコードスニペットの実装は、GitHubプロジェクトにあります。