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,就自己写了一个方法把List处理成List<Map<String, String>>,也可以导出文本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 }}都会无法解析。

posted @ 2020-11-19 18:05  宇宙野牛  阅读(3790)  评论(0编辑  收藏  举报