Word 模板渲染引擎-Poi-tl - 标签(三)
共 4368字,需浏览 9分钟
·
2022-04-01 20:49
“ 在文档的任何地方做任何事情(Do Anything Anywhere)是poi-tl的星辰大海。”
一、标签-列表上一节我们对
Poi-tl
的图片标签
,表格标签
进行了讲解, 本文就继续对 poi-tl 的标签进行介绍.
1. 列表标签
图片标签以开始:{{var}}
2. 数据模型
List
NumberingRenderData
NumberingRenderData可以创建多级列表,但是推荐使用区块对:区块对的循环功能可以很好的循环列表,并且保持有序列表编号有序。
3. 编号样式
编号样式支持罗马字符, 有序无序等, 可以通过 Numberings.of(NumberingFormat) 来指定。具体如下:
DECIMAL //1. 2. 3.
DECIMAL_PARENTHESES //1) 2) 3)
BULLET //● ● ●
LOWER_LETTER //a. b. c.
LOWER_ROMAN //i ⅱ ⅲ
UPPER_LETTER //A. B. C.
4. 示例
4.1 创建模板
4.2 渲染
XWPFTemplate template = XWPFTemplate
// 编译模板
.compile(templateResource.getInputStream())
// 渲染模板
.render(
// 渲染模板可以通过 Map 或者 POJO
new HashMap() {
{
put("listDecimal", Numberings.ofDecimal("item1",
"item2",
"item3")
.create());
put("listDp", Numberings.ofDecimalParentheses("item1",
"item2",
"item3")
.create());
put("listBullet", Numberings.of("item1",
"item2",
"item3")
.create());
put("listLl", Numberings.of(NumberingFormat.LOWER_LETTER)
.addItem("item1")
.addItem("item2")
.addItem("item3")
.create());
put("listLr", Numberings.of(NumberingFormat.LOWER_ROMAN)
.addItem("item1")
.addItem("item2")
.addItem("item3")
.create());
put("listUl", Numberings.of(NumberingFormat.UPPER_LETTER)
.addItem("item1")
.addItem("item2")
.addItem("item3")
.create());
}
}
);
4.3 查看
二、标签-区块对1. 区块对标签
区块对由前后两个标签组成,开始标签以?标识,结束标签以/标识:{{?sections}}{{/sections}}
2. 区块对应用场景
区块对开始和结束标签中间可以包含多个图片、表格、段落、列表、图表等,开始和结束标签可以跨多个段落,也可以在同一个段落,但是如果在表格中使用区块对,开始和结束标签必须在同一个单元格内,因为跨多个单元格的渲染行为是未知的。
区块对在处理一系列文档元素的时候非常有用,位于区块对中的文档元素可以被渲染零次,一次或N次,这取决于区块对的取值。
False或空集合
: 隐藏区块中的所有文档元素
如果区块对的值是 null 、false 或者空的集合,位于区块中的所有文档元素将不会显示,这就等同于if语句的条件为 false。
非False且不是集合
: 显示区块中的文档元素,渲染一次
如果区块对的值不为 null 、 false ,且不是集合,位于区块中的所有文档元素会被渲染一次,这就等同于if语句的条件为 true。
非空集合
: 根据集合的大小,循环渲染区块中的文档元素
如果区块对的值是一个非空集合,区块中的文档元素会被迭代渲染一次或者N次,这取决于集合的大小,类似于foreach语法。
集合是根据值的类型是否实现了 Iterable 接口来判断。
3.示例
3.1 创建模板
3.2 渲染
XWPFTemplate template = XWPFTemplate
// 编译模板
.compile(templateResource.getInputStream())
// 渲染模板
.render(
// 渲染模板可以通过 Map 或者 POJO
new HashMap() {
{
// False或空集合
put("section1", false);
// 非False且不是集合
put("section2", "JavaFamily");
// 非空集合
put("section3", Arrays.asList(4, 5, 6, 7));
}
}
);
3.3 查看
4. 区块对的作用域
区块对中标签的作用域会被限定在当前区块对内,当且仅当区块对的值是boolean类型且为true时,这些标签内的引用才可以引用到外部变量值.
4.1 测试模板
4.2 渲染变量
// 定义一个变量, 在 section 标签内引用
put("scope", "global");
put("section4", Arrays.asList(
SectionItemVo.builder()
.age(12)
.name("Item1")
.build(),
SectionItemVo.builder()
.age(13)
.name("Item2")
.build(),
SectionItemVo.builder()
.age(14)
.name("Item3")
.build()));
// section 值为 true 时, 标签内可以引用到标签外的变量
put("section5", true);
4.3 渲染结果
三、标签-引用标签1. 引用标签
嵌套又称为导入、包含或者合并,以+标识:
{{+var}}
2. 数据模型
DocxRenderData
推荐使用工厂 Includes 构建嵌套模型。
3. 示例
3.1 准备两个模板
父模板: 6-1nestedTemplate.docx
子模板: 6-2nestedSubTemplate.docx
3.2 渲染
// 模板文件
final ClassPathResource templateResource
= new ClassPathResource("6-1nestedTemplate.docx");
final ClassPathResource subTemplateResource
= new ClassPathResource("6-2nestedSubTemplate.docx");
XWPFTemplate template = XWPFTemplate
// 编译模板
.compile(templateResource.getInputStream())
// 渲染模板
.render(
// 渲染模板可以通过 Map 或者 POJO
new HashMap() {
{
final List subData = Arrays.asList(
SectionItemVo.builder()
.age(12)
.name("Item1")
.build(),
SectionItemVo.builder()
.age(13)
.name("Item2")
.build());
put("nested", Includes.ofStream(subTemplateResource.getInputStream())
.setRenderModel(subData)
.create());
}
}
);
3.3 查看
四、下期继续下期继续 poi-tl 标签的讲解, 包括: 引用标签, 图表等....下期再见, 拜了个拜!
如果有任何相关的问题都可以加入 QQ/微信群一起讨论, 学习, 进步. 此外如果有任何对于本公众号的意见和建议也欢迎大家留言积极批评指正, 最后, 愿你我都能成为更好的自己.
我是帅帅, 一个集帅气, 幽默与内涵, 并且热爱编程, 拥抱开源, 喜欢烹饪与旅游的暖男, 我们下期再见. 拜了个拜!
老规矩别忘了哦, 点击原文链接跳转到我们官方的博客平台哦.
悄悄话
————
每文一句
————
Don't aim for success if you really want it. Just stick to what you love and believe in, and it will come naturally.
少一些功利主义的追求, 多一些不为什么的坚持.
日常求赞
————
你们白漂的力量就是我拖更的史诗级动力, 点赞, 评论, 再看, 赞赏, 看都看到这了, 随便点一个咯.
关注加好友
拉你进大佬交流群
————————————————