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 }}都會無法解析。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM