之前写过一个POI 依据word模板 替换 ${xxx}属性 demo,正式上项目中,还有一些不足,比如说表格/图片/复选框等… 以poi的方式扩展起来很麻烦,还要整合/抽离一些方法,编码量太过于复杂。
由此采用新的方式去实现 POI -TL
使用
maven
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.9.1</version>
</dependency>
Gradle
compile group: 'com.deepoove', name: 'poi-tl', version: '1.9.1'
使用:
模板样式:
效果:
若插入图片,则模板里应为 :${@urlImg}
@Test
public void test() throws Exception {
Map<String, Object> datas = new HashMap<>();
datas.put("A", "北京盛世科技有限公司");
datas.put("B", "北京科技有限公司");
datas.put("C", "12342213391139435111");
datas.put("D", "201809823481");
datas.put("E","华东");
datas.put("F","北京海淀地块1");
datas.put("G","A");
datas.put("H","8");
datas.put("I","1013");
datas.put("J","李青书");
datas.put("K","上海科技集团");
datas.put("L","1000000000000000");
datas.put("M","2015483247238");
datas.put("N","自然人更换");
datas.put("O","测试科技公司");
// 打印成PDF时需设置,但不好使。 TextRenderData("\uF0FE",new Style("Wingdings 2",14))
datas.put("AA",new TextRenderData("R",new Style("Wingdings 2",14)));
datas.put("BB",new TextRenderData("R",new Style("Wingdings 2",14)));
datas.put("CC",new TextRenderData("R",new Style("Wingdings 2",14)));
datas.put("DD",new TextRenderData("R",new Style("Wingdings 2",14)));
datas.put("EE",new TextRenderData("R",new Style("Wingdings 2",14)));
datas.put("FF",new TextRenderData("R",new Style("Wingdings 2",14)));
datas.put("GG",new TextRenderData("R",new Style("Wingdings 2",14)));
datas.put("HH",new TextRenderData("R",new Style("Wingdings 2",14)));
datas.put("II",new TextRenderData("R",new Style("Wingdings 2",14)));
datas.put("JJ",new TextRenderData("R",new Style("Wingdings 2",14)));
datas.put("KK",new TextRenderData("□",new Style("宋体",14)));
datas.put("LL",new TextRenderData("R",new Style("Wingdings 2",14)));
// 设置年月日
datas.put("Date",DateUtils.formatDate(new Date(),"yyyy年MM月dd日"));
datas.put("UserName","姜泥");
// 图片
datas.put("urlImg", Pictures.ofUrl("http://deepoove.com/images/icecream.png", PictureType.PNG)
.size(300, 300).create());
// 通过模板文件直接获取
/* XWPFTemplate.compile("src/test/java/DocTemplate/testRenamed.docx").render(datas)
.writeToFile("src/test/java/DocTemplate/testRenamed-print.docx");*/
// 通过字节流方式
ByteArrayOutputStream bos = new ByteArrayOutputStream();
XWPFTemplate.compile("src/test/java/DocTemplate/test.docx").render(datas).writeAndClose(bos);
}
当然如果有些同学更偏爱freemarker ${}的方式,poi-tl 也支持
// 官网实例
ConfigureBuilder builder = Configure.builder();
XWPFTemplate.compile("template.docx", builder.buid());
builder.buildGramer("${", "}");
// 我在项目中使用
XWPFTemplate.compile(fileInputStream, Configure.builder().buildGramer("${", "}")
.build()).render(datas).writeAndClose(bos);
更多功能等…请参考官网