使用java poi 替换word模板里面的内容
- 需求背景
- 功能实现
-
- 对模板进一步加工,方便我们程序处理
- java代码
- 验证
需求背景
业务提供了一个word的签名模板,要求根据订单内容替换模板中的关键信息,需要替换的内容已明确。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL90zZihGbXpVbk1mYwhnMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL5kDNwUzM1MTM5ITMxkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
功能实现
对模板进一步加工,方便我们程序处理
第一步,我们需要做的就是对模板进行进一步加工处理,将替换的内容使用固定的标签标志。如下图所示
(使用${}来声明关键词的原因是为了方便查看和防止原文中有相同的单词,类似freemark的标签,非必须的,可根据自己需要加工即可)。
java代码
@Override
public File generateAttorneySignatureFile(Map<String, String> dataMap) throws IOException {
File exportFile = new File("D:\\tmp\\written+form-模板标记1.doc");
InputStream ins = new FileInputStream(new File("D:\\tmp\\written+form-模板标记.doc"));
HWPFDocument document = new HWPFDocument(ins);
// 读取word的文本内容
Range bodyRange = document.getRange();
// 根据第二部加工的key进行替换
for (Map.Entry<String, String> entry : dataMap.entrySet()) {
bodyRange.replaceText("${" + entry.getKey() + "}", entry.getValue());
}
//写入新文件
try {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
document.write(byteArrayOutputStream);
OutputStream outputStream = new FileOutputStream(exportFile);
outputStream.write(byteArrayOutputStream.toByteArray());
outputStream.close();
} catch (IOException e) {
Logs.error(e.getMessage(), e);
}
return exportFile;
}
验证
执行以下代码,进行验证,得到的新的签名文档内容如图所示:
Map<String, String> map = new HashMap<>();
map.put("markName", "HE OR SHE");
map.put("markType", "markType");
map.put("applyName", "FeianlING");
wordExportService.generateAttorneySignatureFile(map);
done