本文内容从Poi-tl官方文档摘录,poi-tl是一个基于Java POI的Word模板引擎,有着非常强大的功能
此处只摘录了一些我现在需要用到的功能
文章目录
一、简单示例
1.准备一个模板文档 template.docx
在文档中写上{{title}}
2.写一个测试方法
public class PoiTlTest01 {
@Test
public void testStart() throws IOException {
XWPFTemplate template = XWPFTemplate.compile("template.docx").render(new HashMap<String,Object>(){{
put("title","Hi,poi-tl Word模板引擎");
}});
template.writeAndClose(new FileOutputStream("output.docx"));
}
}
二、标签
1.文本
{{var}}
数据模型:
String 文本
TextRenderData 有样式的文本
HyperlinkTextRenderData 超连接文本
Object 调用toString()方法转换为文本
代码示例:
put("name", "Sayi");
put("author", new TextRenderData("000000", "Sayi"));
put("link", new HyperlinkTextRenderData("website", "http://deepoove.com"));
put("anchor", new HyperlinkTextRenderData("anchortxt", "anchor:appendix1"));
除了使用上面这这种new
方法,还可以使用链式调用,使用更优雅的Text
来构建文本模型
put("name", "Sayi");
put("author", Texts.of("Sayi").color("000000").create());
put("link", Texts.of("website").link("http://deepoove.com").create());
put("anchor", Texts.of("anchortxt").anchor("appendix1").create());
TextRenderData的结构体
{
"text": "Sayi",
"style": {
"strike": false, // 删除线
"bold": true, // 粗体
"italic": false, // 斜体
"color": "00FF00", // 颜色
"underLine": false, // 下划线
"fontFamily": "微软雅黑", // 字体样式
"fontSize": 12, // 字体大小
"highlightColor": "green", // 背景高亮色
"vertAlign": "superscript", // 上标或者下标
"characterSpacing" : 20 // 间距
}
}
文本之间换行使用\n
2.列表
列表标签以*开始:{{*var}}
数据模型:
- NumberingReanderData
推荐使用工厂Numberings构建编号模型
示例代码:
put("list", Numberings.create("Plug-in grammar",
"Supports word text, pictures, table...",
"Not just templates"));
编号样式支持罗马字符、有序无序等,可以通过Numberings.os(NumberingFormat)
来指定
DECIMAL //1. 2. 3.
DECIMAL_PARENTHESES //1) 2) 3)
BULLET //● ● ●
LOWER_LETTER //a. b. c.
LOWER_ROMAN //i ⅱ ⅲ
UPPER_LETTER //A. B. C.
3.区块对
区块对由前后两个标签组成,开始标签以?
标识,结束标签以/
标识,如:
{{?sections}}{{/sections}}
区块对应用范围
区块对开始和结束标签中间可以包含以下内容:
- 多个图片
- 表格
- 段落
- 列表
- 图表
- 等…
其中开始和结束标签可以跨多个段落,也可以在同一个段落,但是如果在表格中使用区块对,开始和结束标签必须在同一个单元格内,因为跨多个单元格的渲染行为是未知的
。
区块对在处理一些列文档元素的时候非常有用,位于区块对中的文档元素可以被渲染零次,一次或N次,这取决于区块对的取值。
False或空集合
隐藏区块中的所有文档元素
如果区块对的值是null、false或者空的集合,位于区块中的所有文档元素将不会显示,等同于if
语句的条件为false
如下:
data-model
{
"announce": false
}
------
template.docx
Made it,Ma!{{?announce}}Top of the world!{{/announce}}
Made it,Ma!
{{?announce}}
Top of the world!