什么是poi-tl
poi-tl(poi template language)是Word模板引擎,使用模板和数据创建很棒的Word文档
poi-tl是一个基于Apache POI的Word模板引擎,也是一个免费开源的Java类库,可以非常方便的集成到项目中,并使用它已经封装好的功能。
为什么选择poi-tl?
方案 | 移植性 | 功能性 | 易用性 |
---|---|---|---|
Poi-tl | Java跨平台 | Word模板引擎,基于Apache POI,提供更友好的API | 低代码,准备文档模板和数据即可 |
Apache POI | Java跨平台 | Apache项目,封装了常见的文档操作,也可以操作底层XML结构 | 文档不全,这里有一个教程:Apache POI Word快速入门 |
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,也可以在指定位置进行合并 |
用户自定义函数(插件) | 插件化设计,在文档任何位置执行函数 |
如何集成
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.12.2</version>
</dependency>
代码示例
源码参见 JUnit XWPFTemplateTest
Word模板参见:template.docx
package com.baomidou.mybatisplus.samples.wrapper;
import java.util.HashMap;
import java.util.Map;
import org.junit.jupiter.api.Test;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.data.Charts;
import com.deepoove.poi.data.Numberings;
import com.deepoove.poi.data.Pictures;
import com.deepoove.poi.data.RowRenderData;
import com.deepoove.poi.data.Rows;
import com.deepoove.poi.data.TableRenderData;
import com.deepoove.poi.data.Tables;
import com.deepoove.poi.data.Texts;
/**
* @author Sayi
*/
public class XWPFTemplateTest {
@Test
public void testRenderTemplate() throws Exception {
Map<String, Object> datas = new HashMap<String, Object>();
// create table
RowRenderData header = Rows.of("Word处理方案", "是否跨平台", "易用性")
.textColor("FFFFFF")
.bgColor("ff9800")
.center()
.rowHeight(2.5f)
.create();
RowRenderData row0 = Rows.create("Poi-tl", "纯Java组件,跨平台", "简单:模板引擎功能,并对POI进行了一些封装");
RowRenderData row1 = Rows.create("Apache Poi", "纯Java组件,跨平台", "简单,缺少一些功能的封装");
RowRenderData row2 = Rows.create("Freemarker", "XML操作,跨平台", "复杂,需要理解XML结构");
RowRenderData row3 = Rows.create("OpenOffice", "需要安装OpenOffice软件", "复杂,需要了解OpenOffice的API");
TableRenderData table = Tables.create(header, row0, row1, row2, row3);
// text
datas.put("header", "定义文档的header");
datas.put("name", "poi-tl使用示例");
datas.put("word", "word模板引擎");
datas.put("time", "2024-10-16");
datas.put("what", "Java Word模板引擎: Minimal Microsoft word(docx) templating with {{template}} in Java.");
datas.put("author", Texts.of("cloudcoder").color("000000").create());
// hyperlink
datas.put("introduce", Texts.of("Word模板引擎poi-tl(poi template language)使用指南").link("https://cloudcoder.blog.csdn.net/article/details/142970288").create());
// picture
datas.put("portrait", Pictures.ofLocal("src/test/resources/sayi.png").size(60, 60).create());
// table
datas.put("solution_compare", table);
// numbering
datas.put("feature",
Numberings.create("Plug-in grammar, add new grammar by yourself",
"Supports word text, local pictures, web pictures, table, list, header, footer...",
"Templates, not just templates, but also style templates"));
// chart
datas.put("chart",
Charts.ofMultiSeries("易用性", new String[] {"代码量", "维护量"})
.addSeries("poi-tl", new Double[] {10.0, 5.0})
.addSeries("freemark", new Double[] {90.0, 70.0})
.create());
XWPFTemplate.compile("src/test/resources/template.docx")
.render(datas)
.writeToFile("target/out_template.docx");
}
}