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 @   宇宙野牛  阅读(4231)  评论(1编辑  收藏  举报
编辑推荐:
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
点击右上角即可分享
微信分享提示