【Java】【Word】 Word テンプレートを読み込んで、Javaで操作する [1] ~ Apache POI / 応用編 ~

はじめに

http://blogs.yahoo.co.jp/dk521123/36584129.html
で、Apache POIを使って、Wordファイル作成までできたので
今回は「Word テンプレートを読み込んで、Javaでプレイスフォルダ「@@VER@@」を置換する」

サンプル

 * テンプレートを読み込んで「@@VER@@」を「Hello World!!」に置き換えるサンプル
  => ただし不十分で、表の中の文字置き換えには対応できていない(他にもありそうだが)ので注意

ReplaceWithPoiDemo.java

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

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

public class ReplaceWithPoiDemo {

  public static void main(String[] args) throws FileNotFoundException, IOException {
    String inputFilePath = System.getProperty("user.dir") + "/template.docx";
    String outputFilePath = System.getProperty("user.dir") + "/output.docx";

    try (XWPFDocument document = new XWPFDocument(new FileInputStream(inputFilePath));) {
      for (XWPFParagraph paragraph : document.getParagraphs()) {

        int numberOfRuns = paragraph.getRuns().size();

        // Collate text of all runs
        StringBuilder stringBuilder = new StringBuilder();
        for (XWPFRun run : paragraph.getRuns()) {
          int position = run.getTextPosition();
          if (run.getText(position) != null) {
            stringBuilder.append(run.getText(position));
          }
        }

        // Continue if there is text and contains "@@VER@@"
        if (stringBuilder.length() > 0 && stringBuilder.toString().contains("@@VER@@")) {
          // Remove all existing runs
          for (int i = 0; i < numberOfRuns; i++) {
            paragraph.removeRun(i);
          }
          String text = stringBuilder.toString().replace("@@VER@@", "Hello World!!");
          // Add new run with updated text
          XWPFRun run = paragraph.createRun();
          run.setText(text);
          paragraph.addRun(run);
        }
      }
      document.write(new FileOutputStream(outputFilePath));
    }

    System.out.println("Done. See " + outputFilePath);
  }
}


関連記事

Java で Word の読み書きを行う ~ Apache POI / 入門編 ~

http://blogs.yahoo.co.jp/dk521123/36584129.html

Word テンプレートを読み込んで、Javaで操作する [1] ~ Apache POI / 応用編 ~

http://blogs.yahoo.co.jp/dk521123/36584422.html

Word テンプレートを読み込んで、Javaで操作する [2] ~ Apache POI / 応用編 ~

http://blogs.yahoo.co.jp/dk521123/36584475.html

Word テンプレートを読み込んで、Javaで操作する [3] ~ Apache POI / 応用編 ~

http://blogs.yahoo.co.jp/dk521123/36586498.html