Java poi-tl 使用 word 模板 生成 word
poi-tl 简绍
poi-tl(poi template language)是Word模板引擎,使用模板和数据创建很棒的Word文档。
在文档的任何地方做任何事情(Do Anything Anywhere)是poi-tl的星辰大海。
poi-tl 官网
横向对比
|
|---|
引入要求
JDK1.8+
Apache POI5.2.2+
所需仓库maven jar包
1 | <dependency> |
使用
新建Word文档template.docx,包含标签 Java poi-tl 使用 word 模板 生成 word
- 代码使用实例
1
2
3
4
5XWPFTemplate template = XWPFTemplate.compile("template.docx").render(
new HashMap<String, Object>(){{
put("title", "Hi, poi-tl Word模板引擎");
}});
template.writeAndClose(new FileOutputStream("output.docx"));
- compile 编译模板
- render 渲染数据
- write 输出到流
- 输出
output.docx
Hi, poi-tl Word模板引擎
Template:模板
模板是Docx格式的Word文档,你可以使用Microsoft office、WPS Office、Pages等任何你喜欢的软件制作模板,也可以使用Apache POI代码来生成模板。
所有的标签都是以结尾,标签可以出现在任何位置,包括页眉,页脚,表格内部,文本框等,表格布局可以设计出很多优秀专业的文档,推荐使用表格布局。
poi-tl模板遵循“所见即所得”的设计,模板和标签的样式会被完全保留。
Data-model:数据
数据类似于哈希或者字典,可以是Map结构(key是标签名称):
1 | Map<String, Object> data = new HashMap<>(); |
可以是对象(属性名是标签名称):
1 | public class Data { |
数据可以是树结构,每级之间用点来分隔开,比如标签对应的数据是author对象的name属性值。
FreeMarker、Velocity文本模板中可以通过三个标签设置图片路径、宽和高:, 但是Word模板不是由简单的文本表示,所以在渲染图片、表格等元素时提供了数据模型,它们都实现了接口 RenderData ,比如图片数据模型 PictureRenderData 包含图片路径、宽、高三个属性。
Output:输出
以流的方式进行输出:
1 | template.write(OutputStream stream); |
比如文件流:
1 | template.write(new FileOutputStream("output.docx")); |
比如网络流:
1 | response.setContentType("application/octet-stream"); |
最后不要忘记关闭这些流。
1 | PoitlIOUtils.closeQuietlyMulti(template, bos, out); |
标签 数据样式
poi-tl是一种无逻辑「logic-less」的模板引擎,没有复杂的控制结构和变量赋值,只有标签。标签由前后两个大括号组成,Java poi-tl 使用 word 模板 生成 word是标签,也是标签,title是这个标签的名称,问号标识了标签类型,接下来我们来看看有哪些默认标签类型(用户可以创建新的标签类型,这属于更高级的话题)。
文本
1 | {{var}} |
数据模型:
- String :文本
- TextRenderData :有样式的文本
- HyperlinkTextRenderData :超链接和锚点文本
- Object :调用 toString() 方法转化为文本
推荐使用工厂 Texts 构建文本模型。
1 | put("name", "Sayi"); |
所见即所得,标签的样式会应用到替换后的文本上,也可以通过代码设定文本的样式。
TextRenderData的结构体
1 | { |
图片
1 | 图片标签以@开始:{{@var}} |
数据模型:
- String :图片url或者本地路径,默认使用图片自身尺寸
- ByteArrayPictureRenderData
- FilePictureRenderData
- UrlPictureRenderData
推荐使用工厂 Pictures 构建图片模型。
1 | // 指定图片路径 |
FilePictureRenderData的结构体
1 | { |
表格
1 | 表格标签以#开始:{{#var}} |
数据模型:
- TableRenderData
推荐使用工厂 Tables 、 Rows 和 Cells 构建表格模型。
Example 1. 基础表格示例
1
2
3
4
5// 一个2行2列的表格
put("table0", Tables.of(new String[][] {
new String[] { "00", "01" },
new String[] { "10", "11" }
}).border(BorderStyle.DEFAULT).create());Example 2. 表格样式示例
1
2
3
4
5// 第0行居中且背景为蓝色的表格
RowRenderData row0 = Rows.of("姓名", "学历").textColor("FFFFFF")
.bgColor("4472C4").center().create();
RowRenderData row1 = Rows.create("李四", "博士");
put("table1", Tables.create(row0, row1));Example 3. 表格合并示例
1
2
3
4
5// 合并第1行所有单元格的表格
RowRenderData row0 = Rows.of("列0", "列1", "列2").center().bgColor("4472C4").create();
RowRenderData row1 = Rows.create("没有数据", null, null);
MergeCellRule rule = MergeCellRule.builder().map(Grid.of(1, 0), Grid.of(1, 2)).build();
put("table3", Tables.of(row0, row1).mergeRule(rule).create());
TableRenderData表格模型在单元格内可以展示文本和图片,同时也可以指定表格样式、行样式和单元格样式,而且在N行N列渲染完成后可以应用单元格合并规则 MergeCellRule ,从而实现更复杂的表格。
TableRenderData的结构体
1 | { |
以上是常用类型 更多请参考官网示例
