Apache POIを使用したJavaでのMicrosoftワープロ

1概要

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

このチュートリアルでは、最も一般的に使用されているOfficeファイル形式であるhttps://poi.apache.org/[Microsoft Word用のApache POI]のサポートに焦点を当てています。 MS Wordファイルのフォーマットと生成、およびこのファイルの解析方法に必要な手順について説明します。

2 Mavenの依存関係

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

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

最新版についてはhttps://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.apache.poi%22%20AND%20a%3A%22poi-ooxml%22[here]をクリックしてくださいこのアーティファクトのバージョン。

3準備

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

3.1. リソースファイル

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

さらに、 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";

興味がある人のために、このチュートリアルの最後のセクションでリンクが与えられているリポジトリ内のこれらのリソースファイルの内容はlink:/rest-with-spring-course?utm__source = blogから抽出されます。

3.2. ヘルパーメソッド

次のセクションで説明されているMS Wordファイルを生成するために使用されるロジックからなるメインメソッドは、ヘルパーメソッドを利用します。

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

このメソッドは、クラスパス上にあるテキストファイルに含まれる内容を抽出します。その名前は渡された String 引数です。次に、このファイル内の行を連結して、結合 String を返します。

4 MS Wordファイル生成

このセクションでは、Microsoft Wordファイルのフォーマットと生成方法について説明します。ファイルの任意の部分を処理する前に、 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);

イメージはクラスパス上のファイルから取得され、指定されたサイズでMS Wordファイルに挿入されます。

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. MS Wordファイルの生成

これで、Microsoft Wordファイルを document 変数からメモリに書き出す準備が整いました。

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

このセクションのすべてのコードスニペットは、 handleSimpleDoc という名前のメソッドにラップされています。

5解析とテスト

このセクションでは、MS Wordファイルの解析と結果の検証について概説します。

5.1. 準備

テストクラスで静的フィールドを宣言します。

static WordDocument wordDocument;

このフィールドは、セクション3と4に示すすべてのコードフラグメントを囲むクラスのインスタンスを参照するために使用されます。

解析とテストを行う前に、上で宣言した静的変数を初期化し、 handleSimpleDoc メソッドを呼び出して現在の作業ディレクトリに rest-with-spring.docx ファイルを生成する必要があります。

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

最後のステップ、MS Wordファイルの解析と結果の検証に進みましょう。

5.2. MS Wordファイルの解析と検証

まず、プロジェクトディレクトリ内の指定されたMS Wordファイルからコンテンツを抽出し、そのコンテンツを List of XWPFParagraph に格納します。

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

次に、タイトルの内容とスタイルが、前に設定したものと同じであることを確認しましょう。

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

簡単にするために、ファイルの他の部分の内容を検証し、スタイルは除外しています。それらのスタイルの検証は、タイトルに対して行ったことと似ています。

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

これで、 rest-with-spring.docx ファイルの作成が成功したと確信できます。

6. 結論

このチュートリアルでは、Microsoft Wordフォーマットに対するApache POIのサポートを紹介しました。 MS Wordファイルを生成し、その内容を確認するために必要な手順を踏みました。

これらすべての例とコードスニペットの実装はhttps://github.com/eugenp/tutorials/tree/master/apache-poi[GitHubプロジェクト]にあります。