SpringBoot 集成 FreeMarker 导出 Word 模板文件(底部附源码) ...

打印 上一主题 下一主题

主题 876|帖子 876|积分 2630

思路解说


  • word 模板文件(doc 或 docx 文件)另存为 xml 文件
  • 将后缀 xml 改成 html;大部分文档会改成 ftl(FreeMarker 的后缀名),因为 word 文件另存为 xml 文件后,xml 文件中的代码很乱,后面的修改会很麻烦,因为我习惯用 VSCode 编辑器,安装 Beautify 插件后,可以自动格式化 html 代码,这样有利于后面的修改
  • 将内容用${param}替换;例:姓名:月牙坠-->姓名:${name}
  • word 文件中的图片是 Base64 编码,我在这里封装了一个方法 imgUrl2Base64(图片地址转Base64编码) top.yueyazhui.word_freemarker.util.ExportDocUtil.getImageBase64
  • 如果想要列表(表格)内容,在 html 文件中找到单个内容,在外层加
    封装导出 word 文件到客户端的方法top.yueyazhui.word_freemarker.service.IExportDocService.exportDocToClient
    html 中引用的数据源是一个Map类型,所以传递数据的时候需要把Object类型转成Map类型
    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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用多少眼泪才能让你相信

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表