做了一个导出Word功能,记录下遇见的坑和技术
一开始我用的poi-tl,在本地执行一切都没有问题,部署到测试环境就报错,在排查一段原因之后发现docx模板在打包jar包的时候会乱码,搞了好久,没搞好,索性直接弃用,换成ftl模板来导入,Freemarker。
废话不多说,直接开始

1.模板准备

1.1将你需要导出的word模板填写部分用字段去代理 ${data?if_exists}

注意:${data}需按顺序写,否则生成xml文档会分开。如果导出需要用到图片在word文档中先插入图片占位.?if_exists空判断

1.2保存成xml文档

1.3将xml放入项目中的Resource/wordTemplate目录下面,然后修改文件后缀名为ftl

1.4 将ftl文件中的这长串字符选中,替换成图片字段${image}

注意:如果在文件中出现中文乱码或者导出成功之后乱码的情况,先在wordTemplate目录下创建一个ftl文件,然后将做好的数据复制到新的ftl里面即可。
ftl中会出现很多报红,这个无需处理,如果有强迫症的需要将一条条报红信息添加到idea配置中

2.导入依赖

     <!-- 引入 freemarker 模板依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId></dependency>

3.创建wordUtils工具类

import freemarker.template.Configuration;
import freemarker.template.Template;
import org.springframework.util.StringUtils;
import sun.misc.BASE64Encoder;import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.Map;/*** word导出工具*/
public class WordUtils {//配置信息,代码本身写的还是很可读的,就不过多注解了private static Configuration configuration;//这里注意的是利用WordUtils的类加载器动态获得模板文件的位置// private static final String templateFolder = WordUtils.class.getClassLoader().getResource("../../").getPath() + "WEB-INF/templetes/";
//    private static final String templateFolder = "H:/web/src/main/webapp/WEB-INF/templates";static {configuration = new Configuration(Configuration.VERSION_2_3_28);configuration.setDefaultEncoding("utf-8");configuration.setClassForTemplateLoading(WordUtils.class, "/wordTemplate");
//            configuration.setDirectoryForTemplateLoading(new File(templateFolder));}private WordUtils() {throw new AssertionError();}public static void exportMillCertificateWord(HttpServletRequest request, HttpServletResponse response, Map map, String title, String ftlFile) throws IOException {Template freemarkerTemplate = configuration.getTemplate(ftlFile);File file = null;InputStream fin = null;ServletOutputStream out = null;try {// 调用工具类的createDoc方法生成Word文档file = createDoc(map, freemarkerTemplate);fin = new FileInputStream(file);response.setCharacterEncoding("utf-8");response.setContentType("application/msword");// 设置浏览器以下载的方式处理该文件名String fileName = title + ".doc";response.setHeader("Content-Disposition", "attachment;filename=".concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));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.close();if (file != null) file.delete(); // 删除临时文件}}private static File createDoc(Map<?, ?> dataMap, Template template) {String name = "WordTemplate.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;}/*** 将图片内容转换成Base64编码的字符串** @param imageFile 图片文件的全路径名称* @return 转换成Base64编码的图片内容字符串*/public static String getImageBase64String(String imageFile) {if (StringUtils.isEmpty(imageFile)) {return "";}File file = new File(imageFile);if (!file.exists()) {return "";}InputStream is = null;byte[] data = null;try {is = new FileInputStream(file);data = new byte[is.available()];is.read(data);is.close();} catch (IOException e) {e.printStackTrace();}BASE64Encoder encoder = new BASE64Encoder();return encoder.encode(data);}
}
这块是网上找来直接用到

4.Controller

@GetMapping("/word/download")@AnonymousAccesspublic void wordDownload(Long id, HttpServletRequest request, HttpServletResponse response){service.wordDownload(id,request,response);}

5.Service

/*** 导出异常详情word文档** @param id*/@Overridepublic void wordDownload(Long id, HttpServletRequest request, HttpServletResponse response) {try {if (id == null) {throw new PtException("请求参数错误!");}//模板数据Map<String, Object> data = new HashMap<>();data.put("data", id);//key:${data} value :值data.put("image", WordUtils.getImageBase64String(file.getFilePath()));//查询出来的地址WordUtils.exportMillCertificateWord(request,response,data,"详情","displayScreenException.ftl");} catch (Exception e) {throw new PtException("操作异常", e);}}

0002、Freemarker导出Word文档相关推荐

  1. freemarker导出Word文档并在其中插入图片

    先将word转成xml格式,再用notepad将其转为ftl格式(将要填入数据的地方加个占位符,${name}) import java.io.File; import java.io.FileInp ...

  2. freemarker导出word文档——WordXML格式解析

    前不久,公司一个项目需要实现导出文档的功能,之前是一个同事在做,做了3个星期,终于完成了,但是在项目上线之后却发现导出的文档有问题,此时,这个同事已经离职,我自然成为接班者,要把导出功能实现,但是我看 ...

  3. 使用freemarker导出word文档包含多张图片

    使用freemarker导出word文档包含多张图片 最近项目中有个需求就是导出word文档并且文档中需要有多张图片,我当时一脸懵逼啊,之前没有搞过这个啊,但是不要灰心,肯定会有很多人搞过的,百度一下 ...

  4. freemarker导出word文档

    使用freemarker导出word文档的过程 **************************************************************************** ...

  5. SpringBoot整合Freemarker导出word文档表格

    freemarker模板里面的template.process()方法里传入的第一个参数Object类型,如果是一个实体类对象在模板上怎么进行渲染,将实体类的值取出 freemarker会调用Obje ...

  6. Java+freemarker 导出Word文档的实现(包括word for Mac 插入域的方法)-静态数据,动态表格list

    1. 准备环境 1.1 word版本:MacOS系统下的Office360 word for Mac下好多操作和win的不一样啊啊啊,差点栽在Mac word的模版设计上. win版本的word模版设 ...

  7. java循环导出word文档_Java使用freemarker导出word文档

    通过freemarker,以及JAVA,导出word文档. 共分为三步: 第一步:创建模板文件 第二步:通过JAVA创建返回值. 第三步:执行 分别介绍如下: 第一步: 首先创建word文档,按照想要 ...

  8. java 如何将word 转换为ftl_使用 freemarker导出word文档

    近日需要将人员的基本信息导出,存储为word文档,查阅了很多资料,最后选择了使用freemarker,网上一共有四种方式,效果都一样,选择它呢是因为使用简单,再次记录一下,一个简单的demo,仅供参考 ...

  9. Java后端使用Freemarker导出word文档的各种细节

    2019独角兽企业重金招聘Python工程师标准>>> 1.前言 最近在项目中,因客户要求,需要做一个导出成word的功能(比如月度报表等),技术选型也考虑过几种,比如easypoi ...

最新文章

  1. Flutter入门(mac环境变量配置)
  2. 离散数学反对称关系_【离散数学】1.2&1.3集合与元素,集合与集合之间的关系...
  3. height:calc(100% - 10px)的用法(垂直居中) - 布局篇
  4. 3563: DZY Loves Chinese - BZOJ
  5. 漫谈iOS Crash收集框架
  6. Memcached主主复制+Keepalived高可用架构
  7. opencv 实现等值线_OpenCV图像增强算法实现(直方图均衡化、拉普拉斯、Log、Gamma)...
  8. “KVM is not available”的相应解决方案
  9. Hyper snap
  10. linux下PHP后台配置极光推送问题
  11. python 中的list 转 array 以及 array 转 list 以及array.array numpy.array
  12. iOS开发基础 - UIDataDetectorTypes
  13. call stack详解
  14. 电脑有英伟达独显,有了英伟达显卡驱动还要英特尔显卡驱动吗?
  15. 博主已开启评论精选什么意思_什么叫独立站?
  16. c语言编程一个登陆界面设计,怎么用C语言编写个登陆界面?
  17. Torah RVP Claiming Tutorial
  18. python str转为list,dict,tuple等 eval,exec,
  19. vb.net LPT端口 开钱箱和小票纸打印超时问题解决办法
  20. 功能测试与性能测试常见方法

热门文章

  1. Linux下ps参数详解
  2. 漏洞利用(CVE-2017-5638)
  3. 1730: 珠心算测验
  4. 莫古力最新服务器,《最终幻想14》将调整现有人口平均化策略
  5. Markdownpad2报错: Html Rendering Error (An error occurred with the Html rendering component.)
  6. 读《Oracle 数据库应用与实践》
  7. 【sql】178. 分数排名---两种解决方法,是否使用group by分组成为重点,建议使用分组!!!
  8. 成功实现NAS家庭服务器(流媒体播放、文件共享及下载机)
  9. 从玉农业考察汕尾华侨管理区-林裕豪:携手谋定农业产业
  10. 关于在WIN10中使用照片查看器的问题