easypoi導出word帶圖片
一、導入pom包
<!-- easypoi處理excel --> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-web</artifactId> <version>4.1.1</version> </dependency> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-base</artifactId> <version>4.1.1</version> </dependency> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-annotation</artifactId> <version>4.1.1</version> </dependency> <!-- poi處理excel -->
二、工具類
package com.zybimer.tools.utils; import cn.afterturn.easypoi.word.WordExportUtil; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.springframework.util.Assert; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import java.net.URLEncoder; import java.util.Map; public class ExportWordUtils { /** * 導出word * <p>第一步生成替換后的word文件,只支持docx</p> * <p>第二步下載生成的文件</p> * <p>第三步刪除生成的臨時文件</p> * 模版變量中變量格式:{{foo}} * @param templatePath word模板地址 * @param temDir 生成臨時文件存放地址 * @param fileName 文件名 * @param params 替換的參數 * @param request HttpServletRequest * @param response HttpServletResponse */ public static void exportWord(String templatePath, String temDir, String fileName, Map<String, Object> params, HttpServletRequest request, HttpServletResponse response) { Assert.notNull(templatePath,"模板路徑不能為空"); Assert.notNull(temDir,"臨時文件路徑不能為空"); Assert.notNull(fileName,"導出文件名不能為空"); Assert.isTrue(fileName.endsWith(".docx"),"word導出請使用docx格式"); if (!temDir.endsWith("/")){ temDir = temDir + File.separator; } File dir = new File(temDir); if (!dir.exists()) { dir.mkdirs(); } try { String userAgent = request.getHeader("user-agent").toLowerCase(); if (userAgent.contains("msie") || userAgent.contains("like gecko")) { fileName = URLEncoder.encode(fileName, "UTF-8"); } else { fileName = new String(fileName.getBytes("utf-8"), "ISO-8859-1"); } XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); String tmpPath = temDir + fileName; FileOutputStream fos = new FileOutputStream(tmpPath); doc.write(fos); // 設置強制下載不打開 response.setContentType("application/force-download"); // 設置文件名 response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); OutputStream out = response.getOutputStream(); doc.write(out); out.close(); } catch (Exception e) { e.printStackTrace(); } finally { delFileWord(temDir,fileName);//這一步看具體需求,要不要刪 } } /** * 刪除零時生成的文件 */ public static void delFileWord(String filePath, String fileName){ File file =new File(filePath+fileName); File file1 =new File(filePath); file.delete(); file1.delete(); } }
三、調用
@Override public void exportWord(PbpGroupCostDto resources, HttpServletRequest request, HttpServletResponse response) throws IOException { Map<String,Object> groupCost = new HashMap<>(); response.setContentType("application/octet-stream"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日"); String reportDate = sdf.format(resources.getDate()); String filename = resources.getGroupName()+reportDate+".docx"; ImageEntity image = new ImageEntity(); image.setHeight(50); image.setWidth(150); String sourceFilePath = getUploadFilePathByLocation(resources.getSignatureUpImg()); // 源文件的磁盤位置 image.setData(image2byte(sourceFilePath)); image.setType(ImageEntity.Data); groupCost.put("img1", image); ExportWordUtils.exportWord("template/tourFeeReport.docx","D:/groupCost",filename,groupCost,request,response); } //使用Url到不出來,只有轉成base64字節數組才能導出 //圖片到byte數組 public byte[] image2byte(String path){ byte[] data = null; FileImageInputStream input = null; try { input = new FileImageInputStream(new File(path)); ByteArrayOutputStream output = new ByteArrayOutputStream(); byte[] buf = new byte[1024]; int numBytesRead = 0; while ((numBytesRead = input.read(buf)) != -1) { output.write(buf, 0, numBytesRead); } data = output.toByteArray(); output.close(); input.close(); } catch (FileNotFoundException ex1) { ex1.printStackTrace(); } catch (IOException ex1) { ex1.printStackTrace(); } return data; }
四、注意點本人使用的是新版本的easypoi該版本貌似不支持setUrl導出,只支持base64位碼導出。最好使用新版的easypoi因為新版本支持{{fe:list }}橫向和縱向循環。