Java读取word模板,并动态生成word
最近有个需求是将数据库里存入的用户个人信息生成一个word然后供用户下载,第一时间就就想到了poi来做,所以记录一下免得自己忘了,忘了也可以回来看看😀
poi-tl主要是通过试事先准备好的模板,然后动态的把数据渲染进去的。当然官网也有很多示例,写得也非常清楚明了,建议还是去看官方的示例
1. 制作模板word
这里主要用到了文本和图片还有就是表格,表格的显示有很多中方法,此处只列举了3种。其他的可以去官网看哦。
2. 动态填充数据后的效果
3. 导入需要的依赖
第一件事情当然是导包咯,在pom.xml下添加下面的依赖就可以使用了
<!-- word-->
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.10.0</version>
</dependency>
4. 填充数据
Java代码种使用poi-tl生成word,主要步骤就4步:
-
设置模板文件的地址和生成后文件的保存地址
-
初始化配置
-
读取模板、数据并渲染
-
渲染完成后保存在指定位置
public class WordTest {
public static void main(String[] args) {
try {
// 模板文件地址
String filePath = "D:\\test\\wordTestTemplate.docx";
// 读取模板后保存生成word的地址
String outPath = "D:\\test\\wordTest.docx";
// 为成绩2的显示绑定行循环,成绩1与3可以不要此行
LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
// 将score22设置为行循环绑定的数据源的key,即key是score22的value会在模板中的{{score22}}处进行解析,成绩1与3可以不要此行
Configure configure = Configure.builder().bind("score22", policy).build();
// 读取模板、数据并渲染
XWPFTemplate template = XWPFTemplate.compile(new File(filePath), configure).render(
// 创建一个map并设置为只读map
Collections.unmodifiableMap(new HashMap<String, Object>() {
{
// 设置普通文本的值
put("username", "张三");
// 设置选择框
String sex = "🚹";
List<String> list = Arrays.asList("🚹", "🚺");
for (int index = 0; index < list.size(); index++) {
if (list.get(index).equals(sex)) {
put("checkBox" + index, "☑");
} else {
put("checkBox" + index, "□");
}
}
// 设置照片的值
FileInputStream inputStream = new FileInputStream(new File("D:\\test\\1 150x150.jpg"));
PictureRenderData pictureRenderData = new PictureRenderData(100, 150, PictureType.suggestFileType(".png"), inputStream);
put("picture", pictureRenderData);
inputStream.close();
// 其他业务获取到数据源
String score = "[{\"name\":\"Chinese\",\"score\":99},{\"name\":\"Math\",\"score\":98},{\"name\":\"English\",\"score\":97}]";
// 成绩1在表格里循环
List<Score> forms = JSON.parseArray(score, Score.class);
for (int i = 0; i < forms.size(); i++) {
put("name" + i, forms.get(i).getName());
put("score" + i, forms.get(i).getScore());
}
// 成绩2
put("score22", forms);
put("total", 110);
// 成绩3
put("score", forms);
}
})
);
// 文件是否已存在,则删除
File file = new File(outPath);
if (file.exists()){
file.delete();
}
// 生成word保存在指定目录
template.writeToFile(outPath);
template.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}