poi-tl 1.8.x 导出Word,解析List格式数据(文本、图片)
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
,就自己写了一个方法把Listtext
:
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 }}
都会无法解析。