最近項目中需要導出Word,根據不同的信息導出不同的內容,包含文本、列表、圖片等,本文使用poi-tl實現在次做以記錄。
- 添加依賴
<!-- word導出 -->
<dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.7.3</version>
</dependency>
<!-- 上面需要的依賴-->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.1.2</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version>
</dependency>
如果項目功能簡單只是使用Word導出功能,只添加poi-tl包就可以,我這里添加的包多是因為還有其他功能,相互之間有影響,升級的話又牽扯太多,所以你懂的~
- 制作模板
文本標簽:使用{{屬性名}}做處理
列表集合:列表中集合使用{{集合名}},列表屬性用[屬性名]處理
圖片列表:集合處理方式都一樣{{集合名}},圖片屬性增加@[@屬性名]
- 編寫代碼
數據構建
/*** 填充數據源* 其中data存放的key值與模板中的文本域值相對應*/
public static Map<String, Object> newData() {Map<String, Object> data = new HashMap<String, Object>();//key要與模板中的別名一一對應data.put("custNo", "bb2");data.put("custCnName", "特特我");data.put("productCategory", "官方的");data.put("orgKey", "4433");data.put("riskLevel", "1001");List<Map<String,Object>> list = new ArrayList<>();Map<String,Object> job ;int num = 1;while (num<3){job = new HashMap<>();job.put("id",num);job.put("reviewStatusName","aaa");job.put("reviewAdvice","bbb");job.put("controlWay","ccc");job.put("reviewUser","ddd");job.put("reviewDate",LocalDateTime.now());job.put("fileName","zipfile.zip");list.add(job);num++;}data.put("approvals", list);List<Map<String,Object>> maps1 = new ArrayList<>();for (int i = 1; i <= 5; i++) {Map<String,Object> m = new HashMap<>();if(i%2==0){// 讀取本地磁盤圖片m.put("pho", new PictureRenderData(50, 50, "D:\\timg.jpg"));}else {// 讀取本地磁盤圖片m.put("pho", new PictureRenderData(30, 30, "D:\\bug2.png"));}m.put("date",LocalDateTime.now());m.put("text", "共" + 5 + "張圖片,當前為第" + (i) + "張");maps1.add(m);}data.put("imgCollection", maps1);data.put("img", new PictureRenderData(100, 100, "D:\\需求1.png"));return data;
}
數據處理
public static void main(String[] args) {try {String filePath = "G:\\產品詳情.docx";//模板路徑Map<String,Object> pdfMap = newData();log.info("響應信息:{}",pdfMap);String custCnName = pdfMap.get("custCnName")+"";String stt = "download" + File.separator + "產品詳情頁.docx";log.info("--------------{}----{}--------" , File.separator + "產品詳情頁.docx",stt);InputStream inputStream = new FileInputStream(filePath);String fileName = custCnName + "-產品風險查詢詳情";HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();Configure config = Configure.newBuilder().bind("approvals", policy).bind("imgCollection",policy).build();XWPFTemplate template = XWPFTemplate.compile(inputStream, config).render(pdfMap);String url = "G:\\"+fileName + ".docx";File file = new File(url);file.createNewFile();template.write(new FileOutputStream(file));template.close();} catch (Exception e) {log.error("導出異常:{}",e);}
}
-
導出樣例
☆ 文本
☆ 列表
☆ 圖片
參考:文章 FC464782123