通过freemaker导出word文档SpringBoot+idea,做成浏览器下载
为什么用freemaker呢,因为用freemarker的模板来搞比较方便,比较快捷也让人更好的可以接受
主要还是因为简单,具体的步骤如下
1.首先你要添加freemaker的相关依赖,还需要在配置类application.yml中添加配置
<dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.28</version></dependency>
#################################### Freemarker start ################################## 设置freemarker#设置是否允许HttpServletRequest属性覆盖(隐藏)控制器生成的同名模型属性freemarker:allow-request-override: false# 开发过程建议关闭缓存#启用模板缓存cache: false#检查模板位置是否存在check-template-location: false#设置编码格式charset: UTF-8content-type: text/html; charset=utf-8#设置是否应该在与模板合并之前将所有请求属性添加到模型中。expose-request-attributes: false#设置是否在与模板合并之前将所有HttpSession属性添加到模型中。expose-session-attributes: false#设置是否公开RequestContext供Spring宏库使用,名称为“SpringMacroRequestContext”。expose-spring-macro-helpers: false#所有视图的RequestContext属性的名称。request-context-attribute:# 默认后缀就是.ftlsuffix: .ftltemplate-loader-path: classPath:/code/#################################### Freemarker end ###################################
具体含义请点击这个大佬的链接
springboot集成freemarker 配置application.properties详解 - 冰~橙 - 博客园 (cnblogs.com)
2.你要找到你需要的这个word文档的具体样子
比如,如下图,看着比较简单,没有做表格,但是用到了循环
比如这就是你的表格,之后你要去数据库中找到其对应的字段经行更改
如下图所示
之后进行另存,切记这时保存时要改文件格式
保存完毕之后更改其后缀名为 .ftl 文件
打开之后Ctrl+A Ctrl+C然后找到xml在线格式化
XML 在线格式化 | 菜鸟工具 ,直接复制上去,点格式化,这样你就得到了一份很整齐的代码,之后打开我们的idea,找到你的项目把他放下在如下图所示的位置上
打开.ftl有的应该会报错,要修改成正确的格式比如
<w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="24"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${name}</w:t></w:r>
应为加了遍历所以要加一个list,把它加在你遍历表里的第一个之前,结尾加在遍历的最后
Controller
@PostMapping("user/doc") @ResponseBody @ApiOperation(value="导出用户doc", httpMethod = "POST",produces="application/json",notes = "导出用户doc") public ApiResult exportDoc(Integer pid,Integer id) throws IOException { //这是我自己写的两个查询方法List<BulletinDzh> list = bulletinDzhMapper.selectByPid(pid,id);Bulletin bulletin = bulletinMapper.findByName(pid);Configuration configuration = new Configuration();configuration.setDefaultEncoding("utf-8"); //这是模板的位置configuration.setClassForTemplateLoading(this.getClass(), "/code"); //这是引用的模板Template template = configuration.getTemplate("name.ftl"); //把数据存入到map中,也就是放到了word文档中Map<String,Object> dataMap = new HashMap<String,Object>();dataMap.put("name",bulletin.getName());dataMap.put("newlist",list); //这是年月日Calendar rightNow = Calendar.getInstance();Integer year = rightNow.get(Calendar.YEAR);Integer month = rightNow.get(Calendar.MONTH)+1; //第一个月从0开始,所以得到月份+1Integer day = rightNow.get(Calendar.DAY_OF_MONTH);File outFile = new File("文件导出的名字"+ +year+"-"+month+"-"+day+ ".doc");Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"UTF-8"));try {template.process(dataMap,out);out.flush();out.close();} catch (TemplateException e) {e.printStackTrace();}return ApiResult.ok(); }
可能会遇到的问题
- If you need a particular format only once, use ?string(pattern), like ?string('dd.MM.yyyy HH:mm:ss'), to specify which fields to display
- 如果出现时间报错问题 如上
把ftl中的 <w:t>${new.dutyDate}</w:t>
- 改为 ${new.dutyDate?string('yyyy-MM-dd HH:mm:ss')} 就可以了
- Ftl文件导出为空的解决办法:
- ${template.headImg}//如果值为空那么页面便会报错
- ${template.headImg ! "default"}
- //如果值为空 那么就默认为 ! 感叹号后面引号内的内容 ,切记需要使用双引号
如果你可以通过上面做出导出了,你就直接用下面得代买就好,也就是try后面的,记得要修改文件路径哦,记得看看代码中得注释,有问题可以及时留言
@SneakyThrows@GetMapping("/doc/{id}")@ResponseBody@SysLog(value = "导出简报信息", type = LogTypeEnum.DOWNLOAD)@ApiOperation(value = "导出用户doc", httpMethod = "Get", produces = "application/json", notes = "导出用户doc")public void exportDoc(@PathVariable("id") Integer pid,HttpServletResponse response, HttpServletRequest request) {//此方法是我自己写的查询方法List<BulletinDzh> list = bulletinDzhMapper.selectByPid(pid);//此方法是我自己写的查询方法String bulletin = bulletinMapper.findByName(pid);Configuration configuration = new Configuration(Configuration.VERSION_2_3_23);configuration.setDefaultEncoding("utf-8");configuration.setClassForTemplateLoading(this.getClass(), "/code");Template template = configuration.getTemplate("dzh3.ftl");Map<String, Object> dataMap = new HashMap<>(16);dataMap.put("name",bulletin);dataMap.put("newlist", list);Calendar rightNow = Calendar.getInstance();int year = rightNow.get(Calendar.YEAR);//第一个月从0开始,所以得到月份+1int month = rightNow.get(Calendar.MONTH) + 1;int day = rightNow.get(Calendar.DAY_OF_MONTH);File outFile = new File("简报导出" + +year + "-" + month + "-" + day + ".doc");Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), StandardCharsets.UTF_8));template.process(dataMap, out);//以上为导出到服务器//但这么说不是很准确//以下为做成链接可以在浏览器中下载try {//关键点,需要获取的文件所在文件系统的目录,定位准确才可以顺利下载文件 //部署的服务器地址String filePath = "/yjya/" + "简报导出" + year + "-" + month + "-" + day + ".doc";File file = new File(filePath);String str = "简报导出";//创建一个输入流,将读取到的文件保存到输入流InputStream fis = new BufferedInputStream(new FileInputStream(filePath));byte[] buffer = new byte[fis.available()];fis.read(buffer);fis.close();// 清空responseresponse.reset();// 重要,设置response的Headerresponse.setHeader("Content-Disposition", "attachment;filename=" + new String(str.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1) + year + "-" + month + "-" + day + ".doc");response.setHeader("Content-Length", "" + file.length());//octet-stream是二进制流传输,当不知文件类型时都可以用此属性response.setContentType("application/octet-stream");//跨域请求,*代表允许全部类型response.setHeader("Access-Control-Allow-Origin", "*");//允许请求方式response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");//用来指定本次预检请求的有效期,单位为秒,在此期间不用发出另一条预检请求response.setHeader("Access-Control-Max-Age", "3600");//请求包含的字段内容,如有多个可用哪个逗号分隔如下response.setHeader("Access-Control-Allow-Headers", "content-type,x-requested-with,Authorization, x-ui-request,lang");//访问控制允许凭据,true为允许response.setHeader("Access-Control-Allow-Credentials", "true");//创建一个输出流,用于输出文件OutputStream oStream = new BufferedOutputStream(response.getOutputStream());//写入输出文件oStream.write(buffer);oStream.flush();oStream.close();System.out.println("下载日志文件:" + str + year + "-" + month + "-" + day + ".doc" + "成功");out.flush();out.close();} catch (IOException ioe) {ioe.printStackTrace();System.out.println("下载日志文件出错,错误原因:" + ioe);}}
通过freemaker导出word文档SpringBoot+idea,做成浏览器下载相关推荐
- 今天做了freemaker 导出word文档 的bug修复,解决 \n换行 问题
结合Freemaker导出文件 public void exportSimpleWord() throws Exception{// 要填充的数据, 注意map的key要和word中${xxx}的xx ...
- js导出word文档 可以兼容IE8+浏览器适配其他浏览器
js导出word文档,兼容IE8浏览器 其他浏览器需要引入两个文件:FileSaver.js 和 jqueryWordExport.js 需要兼容IE8浏览器需要引用:FileSaver.js exc ...
- Springboot 使用freemaker导出word文档
利用freemarker导出word文档,主要分为一下几部分,但是循环写入图片是其中最难的一点,尤其是从未使用freemaker导出word模板的新手.话不多说,开搞. 1 找到需要导出的word模 ...
- Freemaker导出word文档并实现预览
文章目录 使用freemaker进行生成word文档并实现预览 一.导入依赖 二.导出word文件步骤 1.将word文档转成ftl文件 2.文件数据绑定 三.导出html文件步骤 四.解析文件并生成 ...
- Springboot 项目导出word文档(文档内容包括数据以及服务器图片)
Springboot 项目freemarker导出word文档(文档内容包括数据以及服务器图片) 前些天有需求要完成导出word文档功能,基础数据导出word文档,网上也能搜到很多源代码,但是我这边要 ...
- SpringBoot整合Freemarker导出word文档表格
freemarker模板里面的template.process()方法里传入的第一个参数Object类型,如果是一个实体类对象在模板上怎么进行渲染,将实体类的值取出 freemarker会调用Obje ...
- java-制作flt模板,导出word文档带图片循环
java-制作flt模板,导出word文档带图片循环 模板制作 制作xml 编辑xml文档 将xml模板转换为flt 编写工具类 导出word工具类 获取远程图片 使用示例 使用示例--springb ...
- Java导出word文档
需求 在开发中,经常会碰到需要导出word文档的时候,比如一些审批表.财务报表等等,接下来介绍一种基于java的简单高效的转换方法 环境 依赖 Apache的POI.FreeMarker和XDocre ...
- 【Java用法】使用Java导出word文档的解决方案(适用于从服务器上下载到本地电脑)
本文目录 一.Controller 二.Service 接口类 三.ServiceImpl 实现类 四.Content-Type 类型与MIME Type类型对照表 最近在做一个word导出功能,需求 ...
最新文章
- 语义分割车道线,来自两篇论文的融合算法
- JavaScript 闭包的详细分享(三种创建方式)(附小实例)
- redis多服务器共享_【数据库】Redis(二)持久化及事务
- Building JavaScript Games for Phones Tablets and Desktop(3)-创造一个游戏世界
- laravel 分词搜索匹配度_【地名地址】面向智慧城市的高精度地名地址匹配方法...
- 集合转数组的toArray()和toArray(T[] a)方法
- POJ 3624 Charm Bracelet 0-1背包
- CCF201609-2 火车购票(100分)
- 三分钟了解云存储网关 使用场景
- flashtool线刷工具
- 系统工程师 运维工程师区别
- 让阿里告诉你, iOS开发者为什么要学 Flutter !
- 【数据库基础】正则化(Normalization)P1:UNF、1NF、2NF、3NF
- 客户流失预测_如何不预测和防止客户流失
- 华视电子web读取身份证信息
- sed学习与实践1:sed基本指令
- JavaScript 删除对象中的某一项
- vue全局注册一个文件夹下所有的组件
- 调LED大屏颜色方法
- 教大家获取百度云盘真实下载链接(告别云盘客户端,全速下载)