最近有个生成Word报告的需求,把数据统计出来然后以Word的形式展示。在网上找了一些实现的技术,包括apache poi和FreeMarker,但两者对于生成word都有些许不够。apache poi提供Java程序对Microsoft Office格式档案读和写的功能,但使用起来很繁琐,操作自由度高,需要自己设计风格以便于维护。FreeMarker以模板引擎的思想,简单易用,对于HTML和XML的操作还好,但Word操作起来并不方便。最后找到了poi-tl。它是Word模板引擎,使用Word模板和数据创建出Word文档。底层封装了apache poi提供更简单易用的Api操作。
poi-tl能够支持常见的文本、图片、表格、列表、图表等基本Word内容处理。除此之外还有其他一些代码高亮、Word批注、书签、锚点、超链接、文本框、模板嵌套、用户自定义函数(插件)等等。
poi-tl的运行逻辑是TDO模式。Template + data-model = output
即:编译模板+数据模型 通过渲染 得到结果。
具体可查看:
1、Maven依赖
<dependency> <groupId>com.deepoove</groupId> <artifactId>poi-tl</artifactId> <version>1.10.0</version> </dependency>
新建Word模板template.docx,包含内容{{var}}
{{}}内的内容可自定义
// 模板加载和渲染 XWPFTemplate template = XWPFTemplate.compile("template.docx").render( // 数据模型 new HashMap<String, Object>(){{ put("var", "Hi, poi-tl Word模板引擎"); }}); // 输出文档 template.writeAndClose(new FileOutputStream("output.docx"));
这样就能完成一个简单的文档渲染。
使用一个案例来说明如何使用poi-tl
1、我们先创建一个template模板,即E:\ComTemp\测试生成word\模板test.docx。这是创建的路径。
2、制作数据模型
直接看代码
File fileTempl = new File("E:\\ComTemp\\测试生成word\\模板test.docx"); // 制作数据模型 HashMap<String, Object> hashMap = new HashMap<>(); // 文本 hashMap.put("title", "Hi, poi-tl Word模板引擎"); hashMap.put("name", "Sayi"); 超链接和锚点文本: hashMap.put("link", Texts.of("website").link("http://deepoove.com").create()); hashMap.put("anchor", Texts.of("anchortxt").anchor("appendix1").create()); // 网络图片(注意网络耗时对系统可能的性能影响) hashMap.put("urlImg", Pictures.ofUrl("http://deepoove.com/images/icecream.png").size(100, 100).create()); // 网络图片(注意网络耗时对系统可能的性能影响) // 表格 // 第0行居中且背景为蓝色的表格 RowRenderData row0 = Rows.of("姓名", "学历").textColor("FFFFFF") .bgColor("4472C4").center().create(); RowRenderData row1 = Rows.create("李四", "博士"); hashMap.put("table", Tables.create(row0, row1)); // 区块对 后续有说明 hashMap.put("person", true); // 工厂 Charts 构建图表模型 ChartMultiSeriesRenderData chart = Charts .ofMultiSeries("ChartTitle", new String[] { "中文", "English" }) .addSeries("countries", new Double[] { 15.0, 6.0 }) .addSeries("speakers", new Double[] { 223.0, 119.0 }) .create(); hashMap.put("barChart", chart);
3、执行渲染输出文档
// 加载模板渲染数据 XWPFTemplate template = XWPFTemplate.compile(fileTempl).render(hashMap); // 输出结果 template.write(new FileOutputStream("E:\\ComTemp\\测试生成word\\output.docx")); template.close();
得到结果
图片的渲染使用{{@…}
表格:{{#…}}
区块对:
区块对开始和结束标签中间可以包含多个图片、表格、段落、列表、图表等。根据区块对的布尔逻辑去展示数据。有以下几种:
- False或空集合
隐藏区块中的所有文档元素
- 非False且不是集合
显示区块中的文档元素,渲染一次
- 非空集合
根据集合的大小,循环渲染区块中的文档元素
图表:
文档的图表是如何与数据模板关联的?答案是文本选线中指定标签名称。
以上介绍了简单的基本poi-tl使用,事实上如果按需求不同,poi-tl还有很多操作word的方法。需要更多操作可以查看官方文档包括文本的样式,表格样式,插件功能、EL表达式等等,极力推荐。写的全面。
http://deepoove.com/poi-tl