Java poi 模板导出Word 带图片
重点!!!
官方文档:https://deepoove.com/poi-tl/#_maven
最终效果
模板
其实内容都在官方文档里写的非常明白了 我这里只是抛砖引玉。
Maven依赖
xml
<poi.version>4.1.2</poi.version>
<poi.tl.version>1.10.0</poi.tl.version>
<!-- excel工具 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${poi.version}</version>
</dependency>
<!--poi Word-->
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>${poi.tl.version}</version>
</dependency>
代码
java
@GetMapping("/word/export/{id}")
public void word(@PathVariable("id") Long id,HttpServletResponse response)
{
//这里自己查询需要导出的内容
GenPersonWordInfoVO wordInfo = genPersonBaseService.getWordInfo(id);
//将JavaBean转为map
HashMap<String, Object> map = new HashMap<>();
Field[] fields = wordInfo.getClass().getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
try {
map.put(field.getName(), field.get(wordInfo));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
//这里放入图片
map.put("headImg", Pictures.ofUrl(wordInfo.getHeadImg()).size(100, 150).center().create());
//这里声明这些字段是列表 需要使用LoopRowTableRenderPolicy 类来处理 看名字也可以发现是循环table的行
LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
Configure config = Configure.builder()
.bind("healthHistory", policy)
.bind("checkHistory", policy)
.bind("touchHistory", policy)
.bind("diagnosisHistory", policy)
.bind("treatmentHistory", policy)
.build();
//加载模板文件 从resources目录下加载
ClassPathResource resource = new ClassPathResource("template/person_file_template.docx");
XWPFTemplate template = null;
try {
template = XWPFTemplate.compile(resource.getInputStream(),config).render(map);
ServletOutputStream out = response.getOutputStream();
response.setContentType("application/force-download");
response.addHeader("Content-Disposition", "attachment;fileName=" + System.currentTimeMillis()+".docx");
template.write(out);
out.flush();
out.close();
template.close();
} catch (IOException e) {
e.printStackTrace();
}
}
最后,官方文档非常详细,完全可以参考官方文档。