easypoi导出word附带图片介绍及注意点
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 }}横向和纵向循环。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!