ByteArrayOutputStream baos = null;
try {
// 郵便局から提供されるテンプレートファイルを読み込む
XWPFDocument templateDoc =
new XWPFDocument(new FileInputStream("C:\\japan_post\\template01.docx"));
// 雛形の内容をすべて削除する(改行がある)
int elementsSize = templateDoc.getBodyElements().size();
for (int i = 0; i < elementsSize; i++) {
templateDoc.removeBodyElement(0);
}
// jasperReport で生成した DOCX ファイルを読み込む
XWPFDocument doc = new XWPFDocument(new ByteArrayInputStream(os.toByteArray()));
// 上記 DOCX ファイルは、表でレイアウトを調整しているので、表の書式を整えつつ
// 雛形ファイルに表をコピーする。
for (XWPFTable t : doc.getTables()) {
// 表自体の VALIGN を中心 (CENTER) にする。
CTTblPr tblPr = t.getCTTbl().getTblPr();
CTJc jc = null;
if (tblPr.isSetJc()) {
jc = tblPr.getJc();
} else {
jc = tblPr.addNewJc();
}
jc.setVal(STJc.CENTER);
// 各セルの行間が標準だと大きすぎるので、設定しなおす
for (XWPFTableRow row : t.getRows()) {
for (XWPFTableCell cell : row.getTableCells()) {
for (XWPFParagraph p : cell.getParagraphs()) {
p.setSpacingAfter(0);
p.setSpacingAfterLines(0);
p.setSpacingBefore(0);
p.setSpacingBeforeLines(0);
p.setSpacingLineRule(LineSpacingRule.EXACT);
// XWPFParagraph に CTSpacing#setLine
// を呼ぶメソッドが無いので、以下のような実装になる。
CTP ctp = p.getCTP();
CTPPr ppr = null;
if (ctp.isSetPPr()) {
ppr = ctp.getPPr();
} else {
ppr = ctp.addNewPPr();
}
CTSpacing spacing = null;
if (ppr.isSetSpacing()) {
spacing = ppr.getSpacing();
} else {
spacing = ppr.addNewSpacing();
}
spacing.setLine(BigInteger.valueOf(280));
}
}
}
// 雛形ファイルに表を1つ作成する。
templateDoc.createTable();
// 書式を設定した表を雛形ファイルに作成した表にセットする。
templateDoc.setTable(templateDoc.getTables().size() - 1, t);
}
baos = new ByteArrayOutputStream();
templateDoc.write(baos);
} catch (IOException e) {
throw new HogeException("帳票生成のIOに失敗", e);
} finally {
IOUtils.closeQuietly(baos);
}
return baos.toByteArray();