SpringBoot 导出Word文档(doc\docx) Office无法打开,WPS正常等坑
以下对于生成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是无法打开的。
转义字符对应的特殊符号:< 对应< , >对应> , &对应&
后记
由于导出的doc格式太旧啦,这里需要将doc换成docx(同样使用freemarker的方式)。见我下一篇博客
https://blog.csdn.net/wantLight/article/details/106105416
SpringBoot 导出Word文档(doc\docx) Office无法打开,WPS正常等坑相关推荐
- js 导出word 文档 doc docx
在做项目时,要将富文本编辑器,或是html内容 导出为word. 先引入文件保存js <script src="FileSaver.js"></script> ...
- Word处理控件Aspose.Words功能演示:使用 C++ 创建 MS Word 文档 (DOC/DOCX)
Aspose.Words 是一种高级Word文档处理API,用于执行各种文档管理和操作任务.API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft Word.此 ...
- 导出word文档生成docx格式 添加水印
为了导出docx格式看了等多文档,最后做个总结依赖包用到dom4j和freemarker,最为方便. <!-- https://mvnrepository.com/artifact/freema ...
- 如何批量将 Doc 格式的 Word 文档转为 Docx 格式
概要:我们都知道 Word 格式有多种.比如常见的有 Doc.Docx,这两种类型是能够相互兼容的,也是能够相互转化的.那今天给大家介绍的是如何将多个 Doc 格式文档批量转为 Docx 格式. 我们 ...
- Springboot 项目导出word文档(文档内容包括数据以及服务器图片)
Springboot 项目freemarker导出word文档(文档内容包括数据以及服务器图片) 前些天有需求要完成导出word文档功能,基础数据导出word文档,网上也能搜到很多源代码,但是我这边要 ...
- 如何下载腾讯在线文档?如何将腾讯在线文档导出为本地Word文档(.docx)
使用电脑访问腾讯文档链接,如:https://docs.qq.com/doc/DRWpuSVNTeG1ZcnhG 然后依次点击:[文件]->[导出为]->[本地Word文档(.docx)]
- Springboot 使用freemaker导出word文档
利用freemarker导出word文档,主要分为一下几部分,但是循环写入图片是其中最难的一点,尤其是从未使用freemaker导出word模板的新手.话不多说,开搞. 1 找到需要导出的word模 ...
- easypoi导出word表格_Java导出word文档(POIamp;Spire.Doc)
导出Word文档整理 前言 业务需要将数据库中存的图片导出成word文档,并给这些图片按照文件名生成目录.以下为解决方案,通常在导出文件时,poi使用的频率较高,可以导出各类模板类的和非模板类的文 ...
- SpringBoot整合Freemarker导出word文档表格
freemarker模板里面的template.process()方法里传入的第一个参数Object类型,如果是一个实体类对象在模板上怎么进行渲染,将实体类的值取出 freemarker会调用Obje ...
最新文章
- linux下gdb使用core文件调试程序,解决“段错误核心已转储“的问题
- pr如何处理音效_学视频剪辑 PR通关教学课程 教程
- 网站运营手册_新媒体代运营模式价格
- Apache Kylin的核心概念
- python文件管理
- 删除鼠标右键打开方式其他程序图标
- 有趣!机器学习预测《守望先锋》里的赢家
- CVPR 2021 最佳论文奖项出炉,何恺明等获最佳论文提名 !
- easyui使用心得
- 如果一个国家是一种颜色,中国的颜色美哭了!
- oracle sql抓取1
- 啊哈C语言 第四章 【代码】【习题答案】
- 技巧:删除桌面上提示找不到该项目的文件
- stc15w404as引脚图_STC15W408AS系列
- 最大矩形面积问题——单调栈法
- 施一公等团队登Science封面:AI与冷冻电镜揭示「原子级」NPC结构,生命科学突破...
- 【rmzt:进击的巨人三笠帅气主题】
- echarts的xAxis的type=’time’
- Android手机投屏后没有声音,乐播投屏电视没有声音怎么办_乐播投屏电视没有声音手机有声音解决办法_3DM手游...
- 【日常】纪录一个愚蠢的问题