1、前言
Poi-tl提供了基於word模板文件導出word文件的功能。文檔地址:http://deepoove.com/poi-tl/。
用下來,總體感覺還是很方便的。但使用過程,有幾個細節,值得記敘。
2、關於復選框
有一組文字,每個詞前面有復選框,根據值的不同,可以打勾,也可以不打勾。
表現如下:
勾選/不勾選在word中使用符號,即Wingdings 2字體。通過查Wingdings 2表:
勾選框:字符代碼為0x0052,對應鍵盤字符R。
不勾選框:字符代碼為0x00A3,由於超過ASCII碼表值,沒有對應鍵盤字符。
模板腳本:
{{actionItem0}}聚餐 {{actionItem1}}轟趴 {{actionItem2}}郊游 {{actionItem3}}唱歌
Spring Boot代碼:
// 字體Wingdings 2的符號
TextRenderData selSymbol = new TextRenderData("R",new Style("Wingdings 2",10.5));
TextRenderData unselSymbol = new TextRenderData("\u00A3",new Style("Wingdings 2",10.5));
int actionItem = actionInfo.getActionItem();
String fieldName = "";
for(int i = 0; i < 4; i++) {
fieldName = "actionItem" + i;
int bitValue = (actionItem >> i) & 0x01;
if (bitValue == 1) {
datas.put(fieldName, selSymbol);
}else {
datas.put(fieldName, unselSymbol);
}
}
4個選項,使用bitmap編碼,bit0表示是否聚餐,bit1表示是否轟趴,bit2表示是否郊游,bit3表示是否唱歌。
然后,就可以輸出word文件了。
// 配置
Configure config = Configure.builder()
.useSpringEL()
.build();
XWPFTemplate template = XWPFTemplate.compile(wordTemplate,config).render(datas);
template.writeAndClose(new FileOutputStream(outputFile));
3、關於圖片列表
如果單個圖片,模板文件中使用{{@var}}即可輸出,但如果是一個列表,就需要用區塊對,然后怎樣顯示圖片對象呢?例子中只有文本列表使用{{=#this}}表示文本項。經試驗,用{{@#this}}表示圖片項。
模板文件:
{{?imgList}}{{@#this}} {{/imgList}}
注意:{{@#this}}后面有一個空格,支持水平排列。
Spring Boot代碼:
// 獲取圖片路徑列表
List<String> imgPathList = getImgPathList();
// 輸出的圖片對象列表
List<PictureRenderData> imgList = new ArrayList<PictureRenderData>();
File imgFile=null;
FileInputStream imgInputStream=null;
BufferedImage image=null;
for (int i =0; i < imgPathList.size(); i++){
String imgPath = imgPathList.get(i);
imgFile=new File(imgPath);
if(imgFile.exists()) {
imgInputStream=new FileInputStream(imgFile);
image= ImageIO.read(imgInputStream);
// 將java圖片轉成PictureRenderData類型對象
PictureRenderData picItem = Pictures.ofBufferedImage(image, PictureType.PNG).size(60, 50).create();
imgList.add(picItem);
}
}
datas.put("imgList",imgList);
這樣,就可以正確顯示圖片列表了。