POI で Word ファイルの編集 〜その1〜


需要はほとんど無いとは思いますが、簡単なサンプルです。

Word ドキュメントを作成する

Excel の場合と同じように、doc と docx とで別クラスを使用します。

クラス フォーマット 説明
HWPFDocument Horrible Word Processor Format 拡張子 doc の MS-Word ドキュメントを扱う
XWPFDocument XML Word Processor Format 拡張子 docx の MS-Word ドキュメントを扱う


空の docx ファイルを作成するのは、単にドキュメントインスタンスを作成してストリームに write するだけです。

public static void main(String...args) throws Exception {
  try (FileOutputStream out = new FileOutputStream(new File("sample.docx"))) {
    XWPFDocument document = new XWPFDocument();
    document.write(out);
  }
}

sample.docx という空の Word ドキュメントが生成されます。

ドキュメントにテキストを書き込む

段落(Paragraph)に対して XWPFRun を作成してテキストを設定します。 XWPFRun は共通のプロパティが定義された文字のかたまりを表します。

段落は XWPFDocument.createParagraph() で作成し、段落から XWPFParagraph.createRun() により XWPFRun を作成してテキストを設定します。

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import java.io.File;
import java.io.FileOutputStream;

public class Main {

    public static void main(String... args) throws Exception {
        try (OutputStream out = new FileOutputStream(new File("sample.docx"))) {
            XWPFDocument document = new XWPFDocument();
            XWPFParagraph paragraph = document.createParagraph();
            XWPFRun run = paragraph.createRun();
            run.setText("サンプル");
            document.write(out);
        }
    }
}        

以下のような Word ドキュメントが生成されます。

f:id:Naotsugu:20150519235405p:plain

テキストのプロパティを設定する

テキストの属性を変更するには XWPFRun に対してプロパティを設定します。

XWPFRun run1 = paragraph.createRun();
run1.setBold(true);
run1.setText("ボールド");
run1.setUnderline(UnderlinePatterns.DASH);

XWPFRun run2 = paragraph.createRun();
run2.setItalic(true);
run2.setFontSize(20);
run2.setText("イタリック");

以下のようになります。

f:id:Naotsugu:20150520001102p:plain

段落に対してプロパティを設定する

段落に対する定義は XWPFParagraphインスタンスに対してプロパティを定義します。

XWPFParagraph paragraph = document.createParagraph();
paragraph.setAlignment(ParagraphAlignment.CENTER);
            
XWPFRun run1 = paragraph.createRun();
run1.setBold(true);
run1.setText("Apache POI");

XWPFRun run2 = paragraph.createRun();
run2.setText("(アパッチ・ポイまたはピーオーアイ)はApacheソフトウェア財団の" +
    "プロジェクトで、WordやExcelといったMicrosoft Office形式のファイル" +
    "を読み書きできる100% Javaライブラリとして提供されている。");

以下のようになります。

f:id:Naotsugu:20150520001545p:plain

ドキュメントのテキストを取得する

XWPFWordExtractor を使うとドキュメントに含まれるテキストを簡単に取得できます。

public static void main(String... args) throws Exception {
  try (InputStream in = new FileInputStream(new File("sample.docx"))) {
    XWPFDocument document = new XWPFDocument(in);
    XWPFWordExtractor we = new XWPFWordExtractor(document);
    System.out.println(we.getText());
  }
}

ドキュメントに含まれるテキストが取得できます。

テーブルを作成する

XWPFDocument.createTable() で行と列を指定してテーブルを作成することができます。

XWPFTable table = document.createTable(2, 3);
table.getRow(0).getCell(0).setText("サンプル1");
table.getRow(1).getCell(1).setText("サンプル2");
table.getRow(1).getCell(2).setText("サンプル3");

または以下のように行を作成してセルを追加していくこともできます。

XWPFTable table = document.createTable();
            
XWPFTableRow row0 = table.getRow(0);
row0.getCell(0).setText("サンプル1");
row0.addNewTableCell();
row0.addNewTableCell();
                    
XWPFTableRow row1 = table.createRow();
row1.getCell(1).setText("サンプル2");
row1.getCell(2).setText("サンプル2");

以下のようになります。

f:id:Naotsugu:20150520002507p:plain

テーブルのサイズを指定する

テーブルの幅を固定するのは結構ややこしいです。

XWPFTable table = document.createTable(2, 3);
table.getRow(0).getCell(0).setText("サンプル1");
table.getRow(1).getCell(1).setText("サンプル2");
table.getRow(1).getCell(2).setText("サンプル3");

for (XWPFTableRow row : table.getRows()) {
    row.setHeight(1000);
    for(XWPFTableCell cell : row.getTableCells()) {
        cell.getCTTc().addNewTcPr().addNewTcW().setW(BigInteger.valueOf(2500L));
    }
}

行の高さは row.setHeight() で指定します。 列の幅は上記の通りです。

f:id:Naotsugu:20150521001148p:plain

もう少し網羅的に書こうと思いましたが、くじけました。。



Apache POI入門

Apache POI入門