生物屋さんのためのゼロからのプログラミング

―忘れないための覚書 (たま~に更新)―

JavaでWordを読み書きする。

以前、Javaでエクセルを編集するコードを書いたが、今回はWordを読み書きしてみる。
JavaでWordを取り扱うには、エクセルの時と同様に“Apache POI”をインストールする必要がある。(ダウンロードは
Apache POI - the Java API for Microsoft Documentsからできる)

まずは、既存のWordファイルを開き、文章を取得し、新しいWordファイルにコピーするコードを書いた。

import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;

public class WordInOut {

	public static void main  (String[] args) throws Exception {
		XWPFDocument doc = new XWPFDocument (
				new FileInputStream("C:\\Users\\aki-miya\\Desktop\\Test file.docx"));
		XWPFWordExtractor ex = new XWPFWordExtractor(doc);
		XWPFDocument exDoc = new XWPFDocument ();
		XWPFParagraph para = exDoc.createParagraph();

		XWPFRun run = para.createRun();

		String tx = ex.getText();
		run.setText(tx);
		System.out.println(tx);
		exDoc.write(new FileOutputStream("C:\\Users\\aki-miya\\Desktop\\Test file-copy.docx"));
	}
}

ただし、このコードでは下記のような文章のWordファイルを読み込むと

Test file
Hellow world
おはよう

次のように、改行が反映されない形で新しいWordファイルにコピーされてしまった。

Test file Hellow world おはよう

そこで、次に“改行が反映された形で新しいWordファイルにコピーする”方法を下記に書く。

import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;

public class WordSplit {

	static StringBuilder sb;

	public static void main  (String[] args) throws Exception {
		XWPFDocument doc = new XWPFDocument (
				new FileInputStream("C:\\Users\\aki-miya\\Desktop\\Test file.docx"));
		XWPFWordExtractor ex = new XWPFWordExtractor(doc);
		XWPFDocument exDoc = new XWPFDocument ();
		XWPFParagraph para = exDoc.createParagraph();

		XWPFRun run = para.createRun();

		String tx = ex.getText();

		String [] txs = tx.split("\n");
		StringBuilder sb = new StringBuilder();
		for ( int i = 0; i < txs.length; i++) {
			sb = new StringBuilder();
			sb.append((i + 1) + " : " + txs[i]);
			run.setText(new String(sb));
			run.addCarriageReturn();
		}

		exDoc.write(new FileOutputStream("C:\\Users\\aki-miya\\Desktop\\Test file-copy2.docx"));
	}
}

このコードでは、上述の下記の文章が

Test file
Hellow world
おはよう

下記のように、改行されるたびに("\n"があるたびに)、番号が振られ改行できるようになった。

1 : Test file
2 : Hellow world
3 : おはよう 

今回は、

for ( int i = 0; i < txs.length; i++) {
    sb = new StringBuilder();

の部分で、各行ごとに新たな"StringBuilder();"を作ることで改行できるようにしたが、もっとキレイな方法がありそう。