Java导出word模板
最近项目中有生成word报文需求, 需求中使用到word模板导出功能, 记录下, 以便复用; 之前有相似需求, 当时做法稍显复杂,区分了doc和docx两种后缀形式的word,本文基于docx模板导出。
1. 编写word模板
首先创建一个docx后缀的word文档, 编写好需要的内容,调好格式; 文档中需要变动替换的内容根据替换的语法进行替换, 以下列出常用的几种替换形式,比较简单:
-
普通文本 -> 双大括号 {{}} 替换; 例如{{object.name}} object为后端java传过来的对象,
object.name即为获取传过来对象的name属性; -
循环 -> 以问号开头, 斜杠结尾; 例如{{?object.personList}}
年龄:{{age}}{{/object.personList}} 循环personList, 遍历展示person的age属性; -
图片 -> 图片替换使用@符号 {{@testRender}}; 注意: 图片替换后端需组装PictureRenderData对象传入;
2. Java导出数据
这里用到的是poi方式,直接上代码:
ConfigureBuilder builder = Configure.newBuilder();
builder.setElMode(Configure.ELMode.SPEL_MODE);
// 需要生成的word
File wordFile = new File("D:/test.docx");
wordFile.getParentFile().mkdirs();
try (
// 根据写好的docx模板创建模板对象
XWPFTemplate template = XWPFTemplate.compile("D:/test_template.docx", builder.build());
FileOutputStream out = new FileOutputStream(wordFile)
) {
// objectDto为数据对象
template.render(objectDto);
template.write(out);
out.flush();
}
导出完成,这种方式相对简单; 之前需求有转换pdf功能, 尝试了几种方式, 发现对格式的保留程度最好的一种是借助libreoffice(Windows和Linux平台表现都还不错), 这里不细讲。