报告生成与导出
说明
主要记录下如何使用Poi-tl生成复杂模板
# 简介
poi-tl(poi template language)是Word模板引擎,使用Word模板和数据创建很棒的Word文档。
在文档的任何地方做任何事情(Do Anything Anywhere)是poi-tl的星辰大海。
# 不同方案对比
方案 | 移植性 | 功能性 | 易用性 |
---|---|---|---|
Poi-tl | Java跨平台 | Word模板引擎,基于Apache POI,提供更友好的API | 低代码,准备文档模板和数据即可 |
Apache POI | Java跨平台 | Apache项目,封装了常见的文档操作,也可以操作底层XML结构 | 文档不全,这里有一个教程:http://deepoove.com/poi-tl/apache-poi-guide.html |
Freemarker | XML跨平台 | 仅支持文本,很大的局限性 | 不推荐,XML结构的代码几乎无法维护 |
OpenOffice | 部署OpenOffice,移植性较差 | - | 需要了解OpenOffice的API |
HTML浏览器导出 | 依赖浏览器的实现,移植性较差 | HTML不能很好的兼容Word的格式,样式糟糕 | - |
Jacob、winlib | Windows平台 | - | 复杂,完全不推荐使用 |
# 功能
使用它,你能轻松应对诸如以下这些场景
Word模板引擎功能 | 描述 |
---|---|
文本 | 将标签渲染为文本 |
图片 | 将标签渲染为图片 |
表格 | 将标签渲染为表格 |
列表 | 将标签渲染为列表 |
图表 | 条形图(3D条形图)、柱形图(3D柱形图)、面积图(3D面积图)、折线图(3D折线图)、雷达图、饼图(3D饼图)、散点图等图表渲染 |
If Condition判断 | 根据条件隐藏或者显示某些文档内容(包括文本、段落、图片、表格、列表、图表等) |
Foreach Loop循环 | 根据集合循环某些文档内容(包括文本、段落、图片、表格、列表、图表等) |
Loop表格行 | 循环复制渲染表格的某一行 |
Loop表格列 | 循环复制渲染表格的某一列 |
Loop有序列表 | 支持有序列表的循环,同时支持多级列表 |
Highlight代码高亮 | word中代码块高亮展示,支持26种语言和上百种着色样式 |
Markdown | 将Markdown渲染为word文档 |
Word批注 | 完整的批注功能,创建批注、修改批注等 |
Word附件 | Word中插入附件 |
SDT内容控件 | 内容控件内标签支持 |
Textbox文本框 | 文本框内标签支持 |
图片替换 | 将原有图片替换成另一张图片 |
书签、锚点、超链接 | 支持设置书签,文档内锚点和超链接功能 |
Expression Language | 完全支持SpringEL表达式,可以扩展更多的表达式:OGNL, MVEL… |
样式 | 模板即样式,同时代码也可以设置样式 |
模板嵌套 | 模板包含子模板,子模板再包含子模板 |
合并 | Word合并Merge,也可以在指定位置进行合并 |
用户自定义函数(插件) | 插件化设计,在文档任何位置执行函数 |
# 使用
Java maven方式使用
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.12.1</version>
</dependency>
2
3
4
5
# 拓展
此处就不在详细的介绍如何使用了,感兴趣或者有报告生成需求的直接点击官网 (opens new window)进行学习。
需求
在word文档中嵌入echarts图标
# 思考
本来这个需求原本是手工完成,用户在浏览器看到echarts图,点击下载。然后粘贴在word中,完成报告。现在需要通过程序来实现。
- 要么前端生成word文档,渲染后直接下载。
- 要么使用Java方式生成,并使用POI方式插入图片。
# 方案
JS生成Word
- html-docx-js (opens new window):Converts HTML documents to DOCX in the browser
- jQuery-Word-Export (opens new window)jQuery plugin for exporting HTML and images to a Microsoft Word document 优点: 通过js的方式就能生成word。 缺点: 文件不能太大 (5M),不灵活。
使用JS的方式不行,还是回到Java程序来生成。
JAVA生成
- ECharts-Java (opens new window): A Java Visualization Library based on Apache ECharts 5.x. 基于 Apache ECharts 5.x 的 Java 可视化类库。
这个确实能用Java实现生成echarts图表与echarts需要option。但是,我需要拿到图片,然后将图片插入到Word中。这不算是一个最终的解决方案。
Node
- echarts-node-export-server (opens new window): Node.js server for offline export of ECharts graphs
最终,我将目光移到了Node上。功夫不负有心人,终于找到了通过option参数就能获取到图片base64数据。也就意味着,能直接写入Word中了。
最终方案
使用 **ECharts-Java (opens new window)**生成符合格式的JSON版本的option,然后调用node-echarts (opens new window) REST
接口生成(图片,直接保存本地,返回地址),base64
,然后转换成图片。再插入到Word中。
最后呢,想表达一句。技术从不是从一而终的,一个需求对应一个直接的解决方案。而是多种方案的折中,取长补短,各取所长。最后达到一个相对而言的比较能接受的方案。
当然,我的这个方案也并不完美,不过提供了一种思路,解决问题时,不要总是将目光局限在自己熟悉领域的一亩三分地里,打开眼界,格局打开👐。或许就能发现不一样的风景🎨。