最近在做一个根据模板导出word文件的功能,大体思路是在模板内使用变量占位,然后通过程序找到占位的变量,然后替换并导出。
经过一顿操作后发现一个问题,发现模板内有的变量可以被替换,有的不可以,模板如下 :
生成的word :
${sumMoney} 这个变量没有被替换,代码部分加上 println。
//替换表格部分的代码
for (XWPFTableRow row : rows) {
List<XWPFTableCell> cells = row.getTableCells();//在行元素中,获得表格的单元格
for (XWPFTableCell cell : cells) { //遍历单元格
List<XWPFParagraph> paragraphs = cell.getParagraphs();
for (XWPFParagraph paragraph : paragraphs) {
String parText = paragraph.getText();//段落文字
System.out.println(parText);
List<XWPFRun> runs = paragraph.getRuns();
for (XWPFRun run : runs) {
String tempText = run.getText(run.getTextPosition());
System.out.println(tempText);
if (tempText != null && textMap.containsKey(tempText)) {
run.setText(textMap.get(tempText).toString(), 0);
}
}
}
}
}
经过调试,查询出打印内容为
${sumMoney}
${
sumMoney
}
可见 ${sumMoney} 被拆分成了三块,导致containsKey验证不到,所以替换失败。
经过反复实验,推断出是word识别单词失败后xml内容会更改,如图全部忽略后,可以正常替换。
忽略后,再次运行,发现大功告成。
这个坑很无语,记录一下,以免下次再遇到。