poi-tl(poi template language)是Word模板引擎,基於Microsoft Word模板和數據生成新的文檔。
1.8.2文檔:Poi-tl Documentation
Github:https://github.com/Sayi/poi-tl
文本
如果文本數據是List格式,如
List<String> listStr = new ArrayList<String>() {
{
add("abc");
add("cba");
}
};
傳入的數據結構為:
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class TemplateEO {
private List<String> listStr;
}
則模板文件可寫為
{{?listStr}}
{{=#this}}
{{/listStr}}
一點插曲
之前沒注意到=#this
,就自己寫了一個方法把List
text
:
private List<Map<String, String>> strList2MapList(List<String> strList){
List<Map<String, String>> mapList = new ArrayList<>();
strList.forEach(str -> {
Map<String, String> map = new HashMap<>();
map.put("text", str);
mapList.add(map);
});
return mapList;
}
圖片
如果圖片數據是List格式(每張圖均需為PictureRenderData類型),如
List<PictureRenderData> listPic = new ArrayList<PictureRenderData>() {
{
add(pic1);
add(pic2);
}
};
截至目前的1.8.2版本就不能用=#this
了,=#this
僅可用來引用當前文本對象。轉換成List<Map<String, PictureRenderData>>
或List<Map<String, Object>>
類型也會解析出錯。我想到的解決方法是新建一個類,類中聲明一個Object類型的變量,然后構建這個類的List。
新建ObjectEO
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ObjectEO {
private Object obj;
}
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class TemplateEO {
private List<ObjectEO> objList;
}
對List<PictureRenderData> pics
進行處理
List<ObjectEO> objectEOS = new ArrayList<>();
pics.forEach(pic-> {
ObjectEO imgObj = ObjectEO.builder().obj(pic).build();
objectEOS.add(imgObj);
});
TemplateEO tempateEO = TemplateEO.builder().objList(objectEOS).build();
模板這樣寫:
{{?objList}}
{{@obj}}
{{/objList}}
注意
還有需要注意的一點,如果想讓圖片在一行中顯示,超出換行,不能寫成下面這樣:
{{?objList}}{{@obj}}{{/objList}}
而應該在循環的變量后至少加一個空格:
{{?objList}}{{@obj}} {{/objList}}
此外模板對空格也很敏感,比如制作模板時復制粘貼文本出現了空格比如{{var }}
都會無法解析。