踩到巨坑!有关XWPFDocument读取word进行占位符替换

570 阅读1分钟

最近有一个小需求需要开发,内容也很简单,但是踩到一个坑,差点怀疑人生。简单说一下需求:给一个word模板文件,里面给定规范的占位符,进行数据的替换,数据在一个excle表格中,然后把替换后的文件生成进行下载,还有就是支持批量多个模板下载然后用压缩包返回,不是很复杂,简单说一下思路。

  1. 首先读取excle模板,把数据获取到,然后解析word文件,遍历文档内容找到占位符进行替换,然后将替换后的文件写入到新文件中,再以文件流的形式返回即可。
  2. 简单看一下代码实现:
// 读取Word文件
File file = new File(url); // Word模板文件路径
FileInputStream fis = new FileInputStream(file);
XWPFDocument document = new XWPFDocument(fis);

```
// 遍历Word文档内容
List<XWPFParagraph> paragraphs = document.getParagraphs();
for (XWPFParagraph paragraph : paragraphs) {
    List<XWPFRun> runs = paragraph.getRuns();
    for (XWPFRun run : runs) {
        String text = run.getText(0);
        for (int i = 1; i < list.length - 1; i++) {
            if (text == null || !text.contains("${data")) {
                continue;
            }
            if (text != null && text.contains("${data" + i + "}")) {
                text = text.replace("${data" + i + "}", list[i]);
                run.setText(text, 0);
            }
        }
    }
}
// 清空response
response.reset();
response.setContentType("application/octet-stream;charset=UTF-8");
response.setCharacterEncoding("utf-8");
String fileName = new String(tempPath.getBytes("UTF-8"), "ISO-8859-1");
response.setHeader("Content-disposition", "attachment;filename=" + fileName);
OutputStream ouputStream = response.getOutputStream();
// 将XWPFDocument写入输出流
document.write(ouputStream);
// 清空缓冲区,结束响应
ouputStream.flush();
ouputStream.close();
```
  1. 为什么踩坑?
  • 如果你使用中文输入法输入英文字母,使用 XWPFDocument对象进行解析的时候,是无法当作一个整体进行解析的,所以我在比对之前能实现占位符的文档时候,差点怀疑人生,因为一模一样,没有任何区别,从肉眼上,直到我debug发现了了差距,虽然写的是${data},但是XWPFDocument对象里面给定样式是中文的,所以一直解析失败。下次写占位符的时候,不能使用中文输入法写英文。