思路解说

  1. word 模板文件(doc 或 docx 文件)另存为 xml 文件
  2. 将后缀 xml 改成 html;大部分文档会改成 ftl(FreeMarker 的后缀名),因为 word 文件另存为 xml 文件后,xml 文件中的代码很乱,后面的修改会很麻烦,因为我习惯用 VSCode 编辑器,安装 Beautify 插件后,可以自动格式化 html 代码,这样有利于后面的修改
  3. 将内容用${param}替换;例:姓名:月牙坠-->姓名:${name}
  4. word 文件中的图片是 Base64 编码,我在这里封装了一个方法 imgUrl2Base64(图片地址转Base64编码) top.yueyazhui.word_freemarker.util.ExportDocUtil.getImageBase64
  5. 如果想要列表(表格)内容,在 html 文件中找到单个内容,在外层加<#list favorites as favorite></#list>

    封装导出 word 文件到客户端的方法top.yueyazhui.word_freemarker.service.IExportDocService.exportDocToClient

    html 中引用的数据源是一个Map<String, Object>类型,所以传递数据的时候需要把Object类型转成Map<String, Object>类型

    word 原文件src/main/resources/attachment/info.doc

FreeMarker 配置

  1. #指定freemarker的模板路径和模板的后缀
  2. spring.freemarker.template-loader-path=classpath:/templates/
  3. spring.freemarker.suffix=.html
  4. # 指定字符集
  5. spring.freemarker.charset=utf-8
  6. # 指定是否要启用缓存
  7. spring.freemarker.cache=false
  8. #指定是否要暴露请求和会话属性
  9. spring.freemarker.expose-request-attributes=true
  10. spring.freemarker.expose-session-attributes=true

FreeMarker 语法

  1. <#noparse>
  2. <#include "./common.ftl">
  3. </#noparse>
  4. <#if favorite.id == 5>
  5. <#break>
  6. </#if>
  7. <#switch sex>
  8. <#case 1>男<#break>
  9. <#case 0>女<#break>
  10. <#default>未知
  11. </#switch>

前端(vue)

api

  1. import request from '@/utils/request'
  2. export function exportDoc() {
  3. return request({
  4. url: '/export/doc/',
  5. method: 'get',
  6. responseType: 'blob'
  7. })
  8. }

view

  1. import { exportDoc } from '@/api/**'
  2. exportDoc().then(res => {
  3. var fileNameEncode = res.headers['content-disposition'].split('filename=')[1]
  4. var fileName = decodeURIComponent(fileNameEncode)
  5. const blob = new Blob([res.data], {
  6. type: res.data.type
  7. })
  8. let link = document.createElement('a')
  9. link.style.display = 'none'
  10. let objectUrl = URL.createObjectURL(blob)
  11. link.href = objectUrl
  12. link.download = fileName
  13. link.click()
  14. URL.revokeObjectURL(objectUrl)
  15. })

注:axios 的响应拦截器

  1. // 二进制数据则直接返回
  2. if (res.request.responseType === 'blob') {
  3. return res
  4. }

源码

word_freemarker

SpringBoot 集成 FreeMarker 导出 Word 模板文件(底部附源码)的更多相关文章

  1. Winforn中DevExpress的TreeList中显示某路径下的所有目录和文件(附源码下载)

    场景 Winform中DevExpress的TreeList的入门使用教程(附源码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...

  2. Asp.net实现直接在浏览器预览Word、Excel、PDF、Txt文件(附源码)

    功能说明 输入文件路径,在浏览器输出文件预览信息,经测试极速(Chrome).IE9.Firefox通过 分类文件及代码说明  DemoFiles 存放可测试文件 Default.aspx  启动页 ...

  3. vue集成cesium,webgis平台第一步(附源码下载)

    vue-cesium-platform Vue结合Cesium的web端gis平台 初步效果 笔记本性能限制,运行Cesium温度飙到70度以上.所以平时开发时先开发界面,之后加载Cesium地球 当 ...

  4. SpringBoot 整合 spring security oauth2 jwt完整示例 附源码

    废话不说直接进入主题(假设您已对spring security.oauth2.jwt技术的了解,不懂的自行搜索了解) 依赖版本 springboot 2.1.5.RELEASE spring-secu ...

  5. SpringBoot集成freemarker和thymeleaf模板

    1.在MAVEN工程POM.XML中引入依赖架包 <!-- 引入 freemarker 模板依赖 --> <dependency> <groupId>org.spr ...

  6. 使用Java生成word文档(附源码)

    当我们使用Java生成word文档时,通常首先会想到iText和POI,这是因为我们习惯了使用这两种方法操作Excel,自然而然的也想使用这种生成word文档.但是当我们需要动态生成word时,通常不 ...

  7. SpringBoot 和Vue前后端分离入门教程(附源码)

    作者:梁小生0101 juejin.im/post/5c622fb5e51d457f9f2c2381 推荐阅读(点击即可跳转阅读) 1. SpringBoot内容聚合 2. 面试题内容聚合 3. 设计 ...

  8. Android 音视频深入 九 FFmpeg解码视频生成yuv文件(附源码下载)

    项目地址,求star https://github.com/979451341/Audio-and-video-learning-materials/tree/master/FFmpeg(MP4%E8 ...

  9. 为何要打印日志?C++在高并发下如何写日志文件(附源码)?

    为何要打印日志?让程序裸奔不是一件很快乐的事么? 有些BUG就像薛定谔的猫,具有波粒二象性,当你试图去观察它时它就消失了,当你不去观察它时,它又会出现.当你在测试人员面前赌咒发誓,亲自路演把程序跑一遍 ...

随机推荐

  1. spring boot 中接口参数为枚举时的反序列化配置(总结)

    步骤 如果是 GET 请求中需要反序列化枚举值(即 url 中的参数[querystring]),确保以下两点 1.1. 重写 StringToEnumConverterFactory 1.2. 配置 ...

  2. windows获取高精度时间戳 精度100ns

    #include <stdio.h> #include <Windows.h> int main(void){ LARGE_INTEGER ticks,Frequency; Q ...

  3. Git拉取远程新分支

    1.查看本地分支  git branch 2.查看远程分支  git branch -a 3.如果要拉取的远程分支本地没有 git fetch 4.拉取远程新分支到本地 git checkout -b ...

  4. 590. N-ary Tree Postorder Traversal - LeetCode

    Question 590. N-ary Tree Postorder Traversal Solution 题目大意:后序遍历一个树 思路: 1)递归 2)迭代 Java实现(递归): public ...

  5. OAuth2.0之OLTU实现举例

    一.场景 三个角色:用户(user),web应用(client),资源服务器和授权服务器合为服务器(server) 用户登录登录后可查看自己的信息 二.准备 2.1 数据库 schema drop t ...

  6. 实践torch.fx第一篇——基于Pytorch的模型优化量化神器

    第一篇--什么是torch.fx 今天聊一下比较重要的torch.fx,也趁着这次机会把之前的torch.fx笔记整理下,笔记大概拆成三份,分别对应三篇: 什么是torch.fx 基于torch.fx ...

  7. 2020级cpp上机考试题解#B卷

    A卷的第七题我只会一个个排除的方法 意思就是暂时没有好办法所以A卷不搞了 1:递归函数求数列 题意: 有一个递归函数int f(int m),计算结果代表了数列的第m项.当m等于1时,函数结果返回1: ...

  8. SSE图像算法优化系列三十二:Zhang\Guo图像细化算法的C语言以及SIMD指令优化

    二值图像的细化算法也有很多种,比较有名的比如Hilditch细化.Rosenfeld细化.基于索引表的细化.还有Opencv自带的THINNING_ZHANGSUEN.THINNING_GUOHALL ...

  9. ARM学习1

    ARM相关概念 1.ARM的发展史 1. 1978年,CPU公司 Cambridge processing Unit 2. 1979年 Acorn 3. 1985年, 32位,8MHz, 使用的精简指 ...

  10. 【Java面试】请说一下Mysql索引的优点和缺点?

    今天分享的这道面试题,让一个工作4年的小伙子去大众点评拿了60W年薪. 这道面试题是: "请你说一下Mysql索引的优点和缺点" 关于这道题,看看普通人和高手的回答 普通人: 嗯. ...