以下对于生成doc文档来说哒,
对于生成docx请移步https://blog.csdn.net/wantLight/article/details/106105416

首先引入freemarker依赖

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

示例Controller:

    @RequestMapping(value = "/export", method = RequestMethod.GET)public void downloadWord(HttpServletRequest request, HttpServletResponse response) {try {// 告诉浏览器用什么软件可以打开此文件response.setHeader("content-Type", "application/msword");// 下载文件的默认名称response.setHeader("Content-Disposition", "attachment;filename=xx分析.doc");Map<String, Object> dataMap = detailService.showWordDetail();//创建配置实例对象Configuration configuration = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);//设置编码configuration.setDefaultEncoding("UTF-8");//加载需要装填的模板//configuration.setClassForTemplateLoading(this.getClass(), "/");ClassPathResource classPathResource = new ClassPathResource("/files/");configuration.setDirectoryForTemplateLoading(classPathResource.getFile());//设置对象包装器configuration.setObjectWrapper(new DefaultObjectWrapper(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS));//设置异常处理器configuration.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);//获取ftl模板对象Template template = configuration.getTemplate("template.ftl");//输出文档StringBuilder fileName = new StringBuilder("啦啦啦啦.doc");//            if (StringUtils.isNotEmpty(data.getStudentName())) {//                fileName.append(data.getStudentName()).append("的简历").append(".doc");
//            } else {//                fileName.append("默认简历").append(".doc");
//            }try {response.setContentType("application/octet-stream");response.setHeader("Content-Disposition", "attachment;filename="+ new String(fileName.toString().getBytes("GBK"), "ISO-8859-1"));response.setCharacterEncoding("utf-8");//处理乱码问题//生成Word文档template.process(dataMap, response.getWriter());} catch (Exception e) {e.printStackTrace();} finally {response.flushBuffer();}} catch (Exception e) {e.printStackTrace();}}

word里面生成图片需要将图片转Base64:

 /*** 本地图片转换Base64的方法** @param imgPath*/public static String imageToBase64(String imgPath) {byte[] data = null;// 读取图片字节数组try {ClassPathResource classPathResource = new ClassPathResource(imgPath);InputStream in = classPathResource.getInputStream();data = new byte[in.available()];in.read(data);in.close();} catch (IOException e) {e.printStackTrace();}// 对字节数组Base64编码BASE64Encoder encoder = new BASE64Encoder();// 返回Base64编码过的字节数组字符串return encoder.encode(Objects.requireNonNull(data));}

我的模板/图片路径都在resources/files下:对应传imgPath = files/图3.jpeg

需要替换的元素用${xxxxxx}占位符在word里替换了,如果有多条数据则添加<#list userList as user><#list>标签,userList是Map里的key。
注意:符号字体格式一定要保持一致,否则会出现转xml后分隔的问题

比较好的办法是:doc中先不写变量,将doc转成xml,然后用doc打开这个xml,这时候加变量就好了,${name}就不会被分离了。建议使用notepad++,借助插件可以自动格式化xml文档

注意:使用wps保存xml时要保存xml格式(03版的doc格式),否则会出现office 打不开的情况(或者图片无法加载)

图片出不来还有可能是w:name的后缀名与实际不符合,加${picStyle}替换后缀名~,还要注意前后标签要顶着你的占位符,不要换行或者有空白!!!

其它

特殊字符的处理:
ftl模板导出word时,如果填充的字符含有特殊字符< 、>、&,那么导出的word是无法打开的。
转义字符对应的特殊符号:&lt; 对应< , &gt;对应> , &amp;对应&

后记

由于导出的doc格式太旧啦,这里需要将doc换成docx(同样使用freemarker的方式)。见我下一篇博客
https://blog.csdn.net/wantLight/article/details/106105416

SpringBoot 导出Word文档(doc\docx) Office无法打开,WPS正常等坑相关推荐

  1. js 导出word 文档 doc docx

    在做项目时,要将富文本编辑器,或是html内容 导出为word. 先引入文件保存js <script src="FileSaver.js"></script> ...

  2. Word处理控件Aspose.Words功能演示:使用 C++ 创建 MS Word 文档 (DOC/DOCX)

    Aspose.Words 是一种高级Word文档处理API,用于执行各种文档管理和操作任务.API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft Word.此 ...

  3. 导出word文档生成docx格式 添加水印

    为了导出docx格式看了等多文档,最后做个总结依赖包用到dom4j和freemarker,最为方便. <!-- https://mvnrepository.com/artifact/freema ...

  4. 如何批量将 Doc 格式的 Word 文档转为 Docx 格式

    概要:我们都知道 Word 格式有多种.比如常见的有 Doc.Docx,这两种类型是能够相互兼容的,也是能够相互转化的.那今天给大家介绍的是如何将多个 Doc 格式文档批量转为 Docx 格式. 我们 ...

  5. Springboot 项目导出word文档(文档内容包括数据以及服务器图片)

    Springboot 项目freemarker导出word文档(文档内容包括数据以及服务器图片) 前些天有需求要完成导出word文档功能,基础数据导出word文档,网上也能搜到很多源代码,但是我这边要 ...

  6. 如何下载腾讯在线文档?如何将腾讯在线文档导出为本地Word文档(.docx)

    使用电脑访问腾讯文档链接,如:https://docs.qq.com/doc/DRWpuSVNTeG1ZcnhG 然后依次点击:[文件]->[导出为]->[本地Word文档(.docx)]

  7. Springboot 使用freemaker导出word文档

    利用freemarker导出word文档,主要分为一下几部分,但是循环写入图片是其中最难的一点,尤其是从未使用freemaker导出word模板的新手.话不多说,开搞. 1  找到需要导出的word模 ...

  8. easypoi导出word表格_Java导出word文档(POIamp;Spire.Doc)

    导出Word文档整理 前言 ​ 业务需要将数据库中存的图片导出成word文档,并给这些图片按照文件名生成目录.以下为解决方案,通常在导出文件时,poi使用的频率较高,可以导出各类模板类的和非模板类的文 ...

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

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

最新文章

  1. linux下gdb使用core文件调试程序,解决“段错误核心已转储“的问题
  2. pr如何处理音效_学视频剪辑 PR通关教学课程 教程
  3. 网站运营手册_新媒体代运营模式价格
  4. Apache Kylin的核心概念
  5. python文件管理
  6. 删除鼠标右键打开方式其他程序图标
  7. 有趣!机器学习预测《守望先锋》里的赢家
  8. CVPR 2021 最佳论文奖项出炉,何恺明等获最佳论文提名 !
  9. easyui使用心得
  10. 如果一个国家是一种颜色,中国的颜色美哭了!
  11. oracle sql抓取1
  12. 啊哈C语言 第四章 【代码】【习题答案】
  13. 技巧:删除桌面上提示找不到该项目的文件
  14. stc15w404as引脚图_STC15W408AS系列
  15. 最大矩形面积问题——单调栈法
  16. 施一公等团队登Science封面:AI与冷冻电镜揭示「原子级」NPC结构,生命科学突破...
  17. 【rmzt:进击的巨人三笠帅气主题】
  18. echarts的xAxis的type=’time’
  19. Android手机投屏后没有声音,乐播投屏电视没有声音怎么办_乐播投屏电视没有声音手机有声音解决办法_3DM手游...
  20. 【日常】纪录一个愚蠢的问题

热门文章

  1. 信息隐藏的原理与应用
  2. 开发一个Canvas小游戏 实现一个游戏“引擎”
  3. 得到网页的最新更新时间
  4. Html5实现的语音搜索功能
  5. linux磁盘坏块 cp报错,Linux磁盘坏道的检测及修复
  6. 二阶常系数齐次线性微分方程的通解
  7. Vue 实现商品详情多播图(点击图片列表轮播图)
  8. matlab 两个txt文件的合并。。
  9. OPA-Gatekeeper使用
  10. Java8 使用 stream().sorted()对List集合进行排序