1、引入依赖
备注:如果没有jar包冲突,可以忽略jar排重(<exclusions>标签内内容)
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>4.3.0</version>
<exclusions>
<exclusion>
<artifactId>poi-ooxml-schemas</artifactId>
<groupId>org.apache.poi</groupId>
</exclusion>
<exclusion>
<artifactId>guava</artifactId>
<groupId>com.google.guava</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-web</artifactId>
<version>4.3.0</version>
<exclusions>
<exclusion>
<artifactId>guava</artifactId>
<groupId>com.google.guava</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-annotation</artifactId>
<version>4.3.0</version>
</dependency>
2、word模板
3、具体代码
3.1controller层
@GetMapping(value = "/exportReportPreview") public void exportReportPreview(HttpServletRequest request, HttpServletResponse response, @RequestParam String no) throws IOException { accidentService.exportReportPreview(request, response, no); }
3.2实现类
@Override public void exportReportPreview(HttpServletRequest request, HttpServletResponse response, String no) throws IOException { Accident accident = this.getAccidentByNo(no); //★★★★★★★★模板存放在resources目录下,具体目录自己根据需求创建 //"template/docx/accident/首报.docx" //fileSavePath 是临时目录(本地测试就是某个盘符下的路径,linux服务器就是具体路径) //word模板地址 TemplateExportParams templateExportParams = new TemplateExportParams("template/docx/accident/首报.docx"); String wordModelPath = templateExportParams.getTemplateUrl(); //生成临时文件地址 Map<String,Object> params = JSON.parseObject(JSON.toJSONString(accident), Map.class); ExportWordUtil.exportWord(wordModelPath,fileSavePath,accident.getTitle() + ".docx",params,request,response); }
3.3工具类
@Slf4j public class ExportWordUtil { /** * 导出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 exportWord(String templatePath, String temDir, String fileName, List<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(); } }