Word 模板渲染引擎-Poi-tl - 標(biāo)簽(三)
“?在文檔的任何地方做任何事情(Do Anything Anywhere)是poi-tl的星辰大海。”

一、標(biāo)簽-列表上一節(jié)我們對
Poi-tl的圖片標(biāo)簽,表格標(biāo)簽進(jìn)行了講解, 本文就繼續(xù)對 poi-tl 的標(biāo)簽進(jìn)行介紹.
1. 列表標(biāo)簽
圖片標(biāo)簽以開始:{{var}}
2. 數(shù)據(jù)模型
List
NumberingRenderData
NumberingRenderData可以創(chuàng)建多級列表,但是推薦使用區(qū)塊對:區(qū)塊對的循環(huán)功能可以很好的循環(huán)列表,并且保持有序列表編號有序。
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 創(chuàng)建模板

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. 區(qū)塊對標(biāo)簽
區(qū)塊對由前后兩個(gè)標(biāo)簽組成,開始標(biāo)簽以?標(biāo)識,結(jié)束標(biāo)簽以/標(biāo)識:{{?sections}}{{/sections}}
2. 區(qū)塊對應(yīng)用場景
區(qū)塊對開始和結(jié)束標(biāo)簽中間可以包含多個(gè)圖片、表格、段落、列表、圖表等,開始和結(jié)束標(biāo)簽可以跨多個(gè)段落,也可以在同一個(gè)段落,但是如果在表格中使用區(qū)塊對,開始和結(jié)束標(biāo)簽必須在同一個(gè)單元格內(nèi),因?yàn)榭缍鄠€(gè)單元格的渲染行為是未知的。
區(qū)塊對在處理一系列文檔元素的時(shí)候非常有用,位于區(qū)塊對中的文檔元素可以被渲染零次,一次或N次,這取決于區(qū)塊對的取值。
False或空集合: 隱藏區(qū)塊中的所有文檔元素
如果區(qū)塊對的值是 null 、false 或者空的集合,位于區(qū)塊中的所有文檔元素將不會(huì)顯示,這就等同于if語句的條件為 false。
非False且不是集合: 顯示區(qū)塊中的文檔元素,渲染一次
如果區(qū)塊對的值不為 null 、 false ,且不是集合,位于區(qū)塊中的所有文檔元素會(huì)被渲染一次,這就等同于if語句的條件為 true。
非空集合: 根據(jù)集合的大小,循環(huán)渲染區(qū)塊中的文檔元素
如果區(qū)塊對的值是一個(gè)非空集合,區(qū)塊中的文檔元素會(huì)被迭代渲染一次或者N次,這取決于集合的大小,類似于foreach語法。
集合是根據(jù)值的類型是否實(shí)現(xiàn)了 Iterable 接口來判斷。
3.示例
3.1 創(chuàng)建模板

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. 區(qū)塊對的作用域
區(qū)塊對中標(biāo)簽的作用域會(huì)被限定在當(dāng)前區(qū)塊對內(nèi),當(dāng)且僅當(dāng)區(qū)塊對的值是boolean類型且為true時(shí),這些標(biāo)簽內(nèi)的引用才可以引用到外部變量值.
4.1 測試模板

4.2 渲染變量
// 定義一個(gè)變量, 在 section 標(biāo)簽內(nèi)引用
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 時(shí), 標(biāo)簽內(nèi)可以引用到標(biāo)簽外的變量
put("section5", true);
4.3 渲染結(jié)果

1. 引用標(biāo)簽
嵌套又稱為導(dǎo)入、包含或者合并,以+標(biāo)識:
{{+var}}
2. 數(shù)據(jù)模型
DocxRenderData
推薦使用工廠 Includes 構(gòu)建嵌套模型。
3. 示例
3.1 準(zhǔn)備兩個(gè)模板
父模板: 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 查看

下期繼續(xù) poi-tl 標(biāo)簽的講解, 包括: 引用標(biāo)簽, 圖表等....下期再見, 拜了個(gè)拜!
? ? ? ?
? ? ? ? 如果有任何相關(guān)的問題都可以加入 QQ/微信群一起討論, 學(xué)習(xí), 進(jìn)步. 此外如果有任何對于本公眾號的意見和建議也歡迎大家留言積極批評指正, 最后, 愿你我都能成為更好的自己.?
? ? ? ? 我是帥帥, 一個(gè)集帥氣, 幽默與內(nèi)涵, 并且熱愛編程, 擁抱開源, 喜歡烹飪與旅游的暖男, 我們下期再見.?拜了個(gè)拜!
? ? ? ??老規(guī)矩別忘了哦,?點(diǎn)擊原文鏈接跳轉(zhuǎn)到我們官方的博客平臺哦.
悄悄話
————
每文一句
————
Don't aim for success if you really want it. Just stick to what you love and believe in, and it will come naturally.
少一些功利主義的追求, 多一些不為什么的堅(jiān)持.
日常求贊
————
? ? ? 你們白漂的力量就是我拖更的史詩級動(dòng)力, 點(diǎn)贊, 評論, 再看, 贊賞, 看都看到這了, 隨便點(diǎn)一個(gè)咯.
關(guān)注加好友
拉你進(jìn)大佬交流群
————————————————
