1、后端代码

@RequestMapping(value = { "wordMultipleExport" }, method = {RequestMethod.POST})public Result createMultipleWord(@RequestBody Map<String, Object> params,HttpServletRequest request,HttpServletResponse response)throws Exception {String fileName = params.get("fileName").toString();List<Map<String, Object>> templateNameList = (List<Map<String, Object>>) params.get("templateNameList");Map<String, Object> data = (Map<String, Object>) params.get("data");String msg="";System.err.println(fileName+"111");System.err.println(templateNameList+"222");System.err.println(data+"333");if (templateNameList.size()>1) {//多文件生成zip压缩包zipUtils.exportMillCertificateWordZip(request, response, templateNameList,data, fileName, "zip");}else {//单文件直接生成word文档try {zipUtils.exportMillCertificateWord(request, response, data,templateNameList.get(0).get("fileName").toString(), templateNameList.get(0).get("templateName").toString());msg = "生成word完毕!";} catch (Exception e) {msg = "生成word失败!";e.printStackTrace();}}return Result.error(msg);}

2.前端代码

//导出数据exportData () {var params = {data : {project_name : "测试项目", //项目名称construction_unit : "测试建设单位", //建设单位edit_date : "2020年3月16日", //编制日期evaluate_unit : "评价单位" //评价单位},templateNameList : [{fileName:"报告1.doc",templateName:"报告1.ftl"},{fileName:"报告2.doc",templateName:"报告2.ftl"},{fileName:"报告3.doc",templateName:"报告3.ftl"}], /* templateNameList : ["1、报告表封面(建设单位公章)--6份.ftl"], */fileName : "全部报告"}return axios({method : 'post',url : baseURL + 'api/wordMultipleExport',data : params,responseType : 'blob'}).then((response) => {// 处理返回的文件流const data = new Blob([ response.data ], {type : "application/msword"}); //,{type: 'application/vnd.ms-excel;charset=utf-8'}let fileName = "全部报告.zip";if (params.templateNameList.length == 1) {fileName = "全部报告.doc";}if (typeof window.chrome !== 'undefined') {// Chrome versionvar link = document.createElement('a');link.href = window.URL.createObjectURL(data);link.download = fileName;link.click();} else if (typeof window.navigator.msSaveBlob !== 'undefined') {// IE versionvar blob = new Blob([ data ], {type : 'application/force-download'});window.navigator.msSaveBlob(blob, fileName);} else {// Firefox versionvar file = new File([ data ], fileName, {type : 'application/force-download'});window.open(URL.createObjectURL(file));}});}

工具类:

/*** */
package shqn.hbxt.modules.environment.utils;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import freemarker.template.Configuration;
import freemarker.template.Template;/*** @author hxl* @date 2020年3月16日 zipUtil.java*/
public class zipUtils {private static Configuration configuration = null;// 这里注意的是利用WordUtils的类加载器动态获得模板文件的位置private static final String templateFolder = zipUtils.class.getClassLoader().getResource("templates/word/").getPath();static {configuration = new Configuration();configuration.setDefaultEncoding("utf-8");try {configuration.setDirectoryForTemplateLoading(new File(templateFolder));} catch (IOException e) {e.printStackTrace();}}private zipUtils() {throw new AssertionError();}/*** 下载单个word文件* @param request 请求* @param response 响应* @param map word结果数据* @param fileName 结果文件名称(不需要带后缀的)* @param templateName word模板名称* @throws IOException*/@SuppressWarnings({ "rawtypes", "unchecked" })public static void exportMillCertificateWord(HttpServletRequest request, HttpServletResponse response, Map<String, Object> dataMap,String fileName,String templateName)throws IOException {Template freemarkerTemplate = configuration.getTemplate(templateName);File file = null;InputStream fin = null;ServletOutputStream out = null;try {// 调用工具类的createDoc方法生成Word文档file = createDoc(dataMap, freemarkerTemplate);fin = new FileInputStream(file);//根据不同浏览器,对fileName进行不同的编码String userAgent = request.getHeader("user-agent").toLowerCase(); if (userAgent.contains("msie") || userAgent.contains("like gecko") ) {  // win10 ie edge 浏览器 和其他系统的ie  fileName = URLEncoder.encode(fileName, "UTF-8");  } else {  // fe  fileName = new String(fileName.getBytes("utf-8"), "iso-8859-1");  }response.setCharacterEncoding("utf-8");response.setContentType("application/msword");// 设置浏览器以下载的方式处理该文件名fileName = fileName+".doc";response.setHeader("Content-Disposition","attachment;filename="+fileName);out = response.getOutputStream();byte[] buffer = new byte[512]; // 缓冲区int bytesToRead = -1;// 通过循环将读入的Word文件的内容输出到浏览器中while ((bytesToRead = fin.read(buffer)) != -1) {out.write(buffer, 0, bytesToRead);}} finally {if (fin != null) {fin.close();}if (out != null) {out.flush();out.close();}if (file != null) {file.delete(); // 删除临时文件}}}/*** 下载批量word文件到一个rar压缩文件中去* @param request 请求* @param response 响应* @param mapList 存放多个word文件的信息:fileName:文件名(不需要带后缀的)、templateName:模板名称、assessResul:数据结果信息的集合* @param data 数据结果信息* @param resultRarFileName 最终下载的压缩文件名称* @param resultFileType 最终下载的压缩文件格式* @throws IOException*/public static void exportMillCertificateWordZip(HttpServletRequest request, HttpServletResponse response, List<Map<String, Object>> mapList,Map<String, Object> data,String resultRarFileName,String resultFileType)throws IOException {File[] docTempleFiles = new File[mapList.size()];String[] docTempleFileName = new String[mapList.size()];ZipOutputStream zipOutputStream = null;try {//遍历结果数据集合,将word模板生成的文件保存在临时文件夹中,文件记录在数组中;for(int i = 0; i < mapList.size(); i++) {String templateName = mapList.get(i).get("templateName").toString();if(Utils.isNotEmpty(templateName)) {File docFile = new File(templateFolder+UUID.randomUUID().toString()+".doc");// 创建 FileInputStream 对象String fileName = mapList.get(i).get("fileName").toString();// 调用工具类的createDoc方法生成Word文档Template freemarkerTemplate = configuration.getTemplate(templateName);docFile = createZipDoc(data, freemarkerTemplate,docFile);//将doc文件放到数组中去docTempleFiles[i] = docFile;//将doc文件中文名称放到文件名数组中去docTempleFileName[i] = fileName;}}//根据不同浏览器,对fileName进行不同的编码String userAgent = request.getHeader("user-agent").toLowerCase(); if (userAgent.contains("msie") || userAgent.contains("like gecko") ) {  // win10 ie edge 浏览器 和其他系统的ie  resultRarFileName = URLEncoder.encode(resultRarFileName, "UTF-8");  } else {  // fe  resultRarFileName = new String(resultRarFileName.getBytes("utf-8"), "iso-8859-1");  }response.setCharacterEncoding("utf-8");response.setContentType("application/octet-stream");// 设置浏览器以下载的方式处理该文件名resultRarFileName = resultRarFileName+"."+resultFileType;response.setHeader("Content-Disposition","attachment;filename="+resultRarFileName);zipOutputStream = new ZipOutputStream(response.getOutputStream());//遍历文件数组,将文件压缩到zip格式的压缩文件中去,for(int i = 0; i < docTempleFiles.length; i++) {File docFile = docTempleFiles[i];FileInputStream fileInputStream = new FileInputStream(docFile);ZipEntry entry = new ZipEntry(docTempleFileName[i]+".doc");zipOutputStream.putNextEntry(entry);int len = -1;byte[] buffer = new byte[1024];while ((len = fileInputStream.read(buffer)) != -1) {zipOutputStream.write(buffer, 0, len);}zipOutputStream.closeEntry();fileInputStream.close();}zipOutputStream.flush();} finally {if (zipOutputStream != null) {zipOutputStream.flush();zipOutputStream.close();}System.err.println(docTempleFiles.length+"__________________文件数量");for(int i = 0; i < docTempleFiles.length; i++) {System.err.println("删除第"+i+"个文件");if (docTempleFiles[i] != null) {docTempleFiles[i].delete();//删除临时doc文件}}}}private static File createDoc(Map<String, Object> dataMap, Template template) {String name = "test.doc";File f = new File(name);Template t = template;try {// 这个地方不能使用FileWriter因为需要指定编码类型否则生成的Word文档会因为有无法识别的编码而无法打开Writer w = new OutputStreamWriter(new FileOutputStream(f), "utf-8");t.process(dataMap, w);w.close();} catch (Exception ex) {ex.printStackTrace();throw new RuntimeException(ex);}return f;}private static File createZipDoc(Map<String, Object> dataMap, Template template,File f) {Template t = template;try {// 这个地方不能使用FileWriter因为需要指定编码类型否则生成的Word文档会因为有无法识别的编码而无法打开Writer w = new OutputStreamWriter(new FileOutputStream(f), "utf-8");t.process(dataMap, w);w.close();} catch (Exception ex) {ex.printStackTrace();throw new RuntimeException(ex);}return f;}
}

利用freemarker模板导出单个word及多word压缩导出到浏览器下载相关推荐

  1. Java项目中利用Freemarker模板引擎导出--生成Word文档

    应邀写的一篇文章:Java项目中利用Freemarker模板引擎导出--生成Word文档 资源下载:https://download.csdn.net/download/weixin_41367523 ...

  2. Java中利用freemarker模板动态生成word含表格

    最近公司有导出word的需求,由于word的样式有的很复杂所以记录一下Java中利用freemarker模板动态生成word含表格,以防以后忘记. 1.word表格的模板 删掉无用的数据留下基础的样式 ...

  3. java生成docx_java利用Freemarker模板生成docx格式的word文档

    之前写过一篇利用Freemarker模板生成doc的博客,不过那个博客有点缺陷,生成的word占用的空间很大,几百页的word有将近100M了.所以,后面需求必须是生成的docx文档,结果导出后正常才 ...

  4. java利用Freemarker模板生成docx格式的word文档(全过程)

    参考汇总: wordexport: JAVA生成并导出Word文档技术论证 java利用Freemarker模板生成docx格式的word文档(全过程) - 旁光 - 博客园 # 参考资料 - 其他项 ...

  5. 利用 freemarker 模板生成 word 小结

    在企业级开发时,不可避免的会遇到生成 word 文档的需求,有两种常用的方案,1.使用 Apache POI 在后台通过代码生成 word 文档:2.使用模板生成 word 文档.第二种方法比较简单, ...

  6. freemarker 生成java_半自动化Java代码生成器[利用freemarker模板生成]

    rapid-generator 半自动化Java代码生成器[利用freemarker模板生成] 增加一些定制和扩展, 修改为基于MAVEN的格式. 整体架构保持不变. 增加的特性为: 支持表名前缀去除 ...

  7. java利用Freemarker模板生成格式友好的doc或者docx文档

    之前写过一篇利用Freemarker模板生成doc的博客,不过那个博客有点缺陷,不支持生成docx格式的文档.所以,这里补充一篇,生成docx或doc格式的文档以具体的docx模板或者doc模板为主. ...

  8. 利用freemarker模板引擎进行word导出

    FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP.它不仅可以用作表现层的实现 ...

  9. Freemarker模板引擎:使用HashMap数据形式,导出word模板

    编写:HorinJsor 文章目录 一.Freemarker是什么? 二.Word模板编写 1.导出为xml格式文档 在这里插入图片描述 2.使用HBuilderX重排格式 3.基本模板语法 三.代码 ...

  10. 利用freemarker模板导出复杂excel可带图片

    效果: 编辑的模板 增加数据 导出的效果 模板是什么样 导出的就是什么样 不是xml重名xlsx版本 输出真实的xlsx格式excel office打开不会报错 version:0.1.5 原作者:c ...

最新文章

  1. 【Linux 经典面试题】
  2. Maximum Depth of Binary Tree
  3. 如何取消计算机用户名,Win10如何取消登录界面显示用户名?
  4. c语言 字符串分隔,c语言字符串分割–strtok | 逗号分隔-huangea的博客
  5. 刷题总结——art2(ssoj)
  6. 14 exec/fork/wait cycles for Process Management
  7. 深入解析软件测试行业!它是否存在前景和出路?
  8. 主板aspm关闭_【装机加人品】主板如何开启与关闭超线程技术?
  9. LiveZilla管理员密码忘记了如何恢复?How can I change the administrator password
  10. virtual memory exhausted: Cannot allocate memory 解决办法 命令分配交换空间
  11. 流利阅读 2019.3.18 Can baijiu, China’s sorghum firewater, go global?
  12. 财报惊喜不断,京东彻底走出阴霾?
  13. 【C语言】世界上不同国家有不同的写日期的习惯。比如美国人习惯写成“月-日-年”,而中国人习惯写成“年-月-日”。下面请你写个程序,自动把读入的美国格式的日期改写成中国习惯的日期。
  14. 小型温控系统c语言程序,pid算法温度控制c语言程序 - 全文
  15. 语音处理/语音识别基础(二)- 声音的存储
  16. 【开发教程10】疯壳·开源蓝牙心率防水运动手环-蓝牙 BLE 收发
  17. 嵌入式linux学习笔记(一)
  18. USB 协议分析之 HID 设备
  19. Android JNI 中文字符传递
  20. 英语时态和完成时详解

热门文章

  1. 观察者模式之气象监测站实例演示(一)
  2. 隐私计算 — 安全多方计算 — Overview
  3. 3万多款插画笔刷,40种风格!完善设计弹药库
  4. altium designer添加原理图库和PCB封装库
  5. 图像边缘检测(canny检测附完整代码与输出样例)
  6. 兰顿蚂蚁 java源代码_兰顿蚂蚁-Java
  7. 【electron】判断当前进程是否是开发环境的五种方案(获取一些资源的路径)
  8. linux线程数和文件句柄数配置
  9. 微信小程序中开通云开发
  10. linux设备驱动归纳总结(三):6.poll和sellct【转】