为什么用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,做成浏览器下载相关推荐

  1. 今天做了freemaker 导出word文档 的bug修复,解决 \n换行 问题

    结合Freemaker导出文件 public void exportSimpleWord() throws Exception{// 要填充的数据, 注意map的key要和word中${xxx}的xx ...

  2. js导出word文档 可以兼容IE8+浏览器适配其他浏览器

    js导出word文档,兼容IE8浏览器 其他浏览器需要引入两个文件:FileSaver.js 和 jqueryWordExport.js 需要兼容IE8浏览器需要引用:FileSaver.js exc ...

  3. Springboot 使用freemaker导出word文档

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

  4. Freemaker导出word文档并实现预览

    文章目录 使用freemaker进行生成word文档并实现预览 一.导入依赖 二.导出word文件步骤 1.将word文档转成ftl文件 2.文件数据绑定 三.导出html文件步骤 四.解析文件并生成 ...

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

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

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

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

  7. java-制作flt模板,导出word文档带图片循环

    java-制作flt模板,导出word文档带图片循环 模板制作 制作xml 编辑xml文档 将xml模板转换为flt 编写工具类 导出word工具类 获取远程图片 使用示例 使用示例--springb ...

  8. Java导出word文档

    需求 在开发中,经常会碰到需要导出word文档的时候,比如一些审批表.财务报表等等,接下来介绍一种基于java的简单高效的转换方法 环境 依赖 Apache的POI.FreeMarker和XDocre ...

  9. 【Java用法】使用Java导出word文档的解决方案(适用于从服务器上下载到本地电脑)

    本文目录 一.Controller 二.Service 接口类 三.ServiceImpl 实现类 四.Content-Type 类型与MIME Type类型对照表 最近在做一个word导出功能,需求 ...

最新文章

  1. 语义分割车道线,来自两篇论文的融合算法
  2. JavaScript 闭包的详细分享(三种创建方式)(附小实例)
  3. redis多服务器共享_【数据库】Redis(二)持久化及事务
  4. Building JavaScript Games for Phones Tablets and Desktop(3)-创造一个游戏世界
  5. laravel 分词搜索匹配度_【地名地址】面向智慧城市的高精度地名地址匹配方法...
  6. 集合转数组的toArray()和toArray(T[] a)方法
  7. POJ 3624 Charm Bracelet 0-1背包
  8. CCF201609-2 火车购票(100分)
  9. 三分钟了解云存储网关 使用场景
  10. flashtool线刷工具
  11. 系统工程师 运维工程师区别
  12. 让阿里告诉你, iOS开发者为什么要学 Flutter !
  13. 【数据库基础】正则化(Normalization)P1:UNF、1NF、2NF、3NF
  14. 客户流失预测_如何不预测和防止客户流失
  15. 华视电子web读取身份证信息
  16. sed学习与实践1:sed基本指令
  17. JavaScript 删除对象中的某一项
  18. vue全局注册一个文件夹下所有的组件
  19. 调LED大屏颜色方法
  20. 教大家获取百度云盘真实下载链接(告别云盘客户端,全速下载)

热门文章

  1. 豪华CEO培训中国试水
  2. 数字逻辑课程设计-加法器设计(三位十进制+八位二进制)
  3. 二分图匹配 - 原理
  4. Java基础知识总结(二)
  5. Flutter知识点总结
  6. 警惕肾囊肿的三大危害
  7. 为什么要有数字验证码,数字验证码是什么?
  8. 微信小程序地址,右侧边栏带字母滑动
  9. Firefox与Safari等浏览器打开新标签页会被拦截问题
  10. 【教程】只要姿势对,解释神经网络的数学过程跟玩似的