1. 程式人生 > 實用技巧 >poi-tl 1.8.x 匯出Word,解析List格式資料(文字、圖片)

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}}

圖片

如果圖片資料是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 }}都會無法解析。