近期有个需求,需要根据预设的Word模板填充数据导出,做完后再来回顾记录下,以备后续不时之需。
本次Word模板填充导出采用的是 Poi-tl (https://deepoove.com/poi-tl/#_why_poi_tl),整个导出非常的友好便捷,不需要额外的环境配置。
一、pom.xml
java
<!-- poi-tl word导出 -->
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.12.2</version>
</dependency>
<!-- 增强富文本导出 -->
<dependency>
<groupId>io.github.draco1023</groupId>
<artifactId>poi-tl-ext</artifactId>
<version>0.4.24-poi5</version>
</dependency>
注:poi-tl-ext 用于富文本导出
二、导出模板

注:
1. 图片参数必须是下划线形式的,不支持驼峰式命名,图片加载方式有好几种,注意区分。
详见:https://deepoove.com/poi-tl/#_%E5%9B%BE%E7%89%87
2.列表参数,把外层key写在循环行的上一列,循环显示是参数用[参数]
详见:https://deepoove.com/poi-tl/#_%E5%88%97%E8%A1%A8
三、代码示例
java
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.config.ConfigureBuilder;
import com.deepoove.poi.data.Pictures;
import com.deepoove.poi.data.Texts;
import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
import com.ruoyi.common.exception.ServiceException;
import org.ddr.poi.html.HtmlRenderPolicy;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Poi-tl Word模板填充导出
*/
public class WordDemo {
public static void main(String[] args) {
String templateFile = "模板示例.docx"; //模板路径
String targetFile = "模板填充_123.docx"; //生成的目标文件路径
String picUrl = "11223.jpg"; //图片路径
/**
* 组装待导出的数据
*/
Map dataMap = new HashMap();
LoopRowTableRenderPolicy renderPolicy = new LoopRowTableRenderPolicy();
ConfigureBuilder configureBuilder = Configure.builder();
//html渲染插件
HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy();
//普通文本数据
dataMap.put("text", Texts.of("我是普通文本").create());
//图片数据(本地数据)
dataMap.put("img_url", Pictures.ofLocal(picUrl).sizeInCm(9.78, 11.16).create());
//列表数据
List<Map> tableList = new ArrayList<>();
Map temp1 = new HashMap();
temp1.put("name", "张三");
temp1.put("sex", "男");
tableList.add(temp1);
Map temp2 = new HashMap();
temp2.put("name", "小花");
temp2.put("sex", "女");
tableList.add(temp2);
dataMap.put("tableData", tableList);
//绑定列表数据code
configureBuilder.bind("tableData", renderPolicy);
//富文本
String richText =
"<p style=\"text-align: center;\"><span style=\"font-size: 14pt;\"><strong>xxx年度安全生产教育培训工作计划</strong></span></p>\n" +
" <p style=\"text-align: center;\"><span style=\"font-size: 14pt;\"><span style=\"font-size: 10pt; color: #e67e23;\">(模板,可上传企业自有制度或修改模板)</span></span></p>\n" +
" <p> </p>\n" +
" <p><span style=\"font-size: 14pt;\"> <span style=\"color: #ba372a;\">为进一步规范公司安全宣传和教育培训工作,不断提高公司员工安全生产意识和安全素质,增强安全生产法制观念,有力推动公司安全生产基础建设、安全生产诚信建设、安全生产标准化建设和企业安全文化建设,确保今年的安全生产目标指标的实现,特制定本计划如下:</span></span></p>"
;
dataMap.put("richText", richText);
//绑定富文本code
configureBuilder.bind("richText", htmlRenderPolicy);
//Poi-tl 导出
Configure configure = configureBuilder.bind("tableData", renderPolicy).build();
XWPFTemplate template = XWPFTemplate.compile(templateFile, configure).render(dataMap);
//文件流导出
FileOutputStream outputStream = null;
try {
outputStream = new FileOutputStream(targetFile);
template.write(outputStream);
} catch (Exception e) {
e.printStackTrace();
throw new ServiceException("根据模板生成Word文件失败。" + e.getMessage());
} finally {
try {
if (null != outputStream) {
outputStream.flush();
outputStream.close();
}
if (null != template) {
template.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
四、导出结果

五、写在最后
以上仅为本人依据当前项目需求做出的一点记录和理解,如有其他见解,欢迎留言。Poi-tl还有更多的用法还待后续研究。