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


    思路解说

    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>
      封装导出 word 文件到客户端的方法top.yueyazhui.word_freemarker.service.IExportDocService.exportDocToClient
      html 中引用的数据源是一个Map类型,所以传递数据的时候需要把Object类型转成Map类型
      word 原文件src/main/resources/attachment/info.doc

    FreeMarker 配置

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

    FreeMarker 语法

    <#noparse>
        <#include "./common.ftl">
    
    
    <#if favorite.id == 5>
        <#break>
    
    
    <#switch sex>
        <#case 1>男<#break>
        <#case 0>女<#break>
        <#default>未知
    
    

    前端(vue)

    api

    import request from '@/utils/request'
    
    export function exportDoc() {
      return request({
        url: '/export/doc/',
        method: 'get',
        responseType: 'blob'
      })
    }
    

    view

    import { exportDoc } from '@/api/**'
    
    exportDoc().then(res => {
      var fileNameEncode = res.headers['content-disposition'].split('filename=')[1]
      var fileName = decodeURIComponent(fileNameEncode)
    
      const blob = new Blob([res.data], {
        type: res.data.type
      })
      let link = document.createElement('a')
      link.style.display = 'none'
      let objectUrl = URL.createObjectURL(blob)
      link.href = objectUrl
      link.download = fileName
      link.click()
      URL.revokeObjectURL(objectUrl)
    })
    

    注:axios 的响应拦截器

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

    源码

    word_freemarker

  • 相关阅读:
    C++ 班级通讯录管理系统
    【算法】动态规划dynamic programing
    机器学习建模高级用法!构建企业级AI建模流水线 ⛵
    web网页设计实例作业HTML+CSS+JavaScript蔬菜水果商城购物设计
    钟汉良日记:你相信神话吗?你会背《正气歌》吗
    关于APS生产排产软件选择,有哪几个要素?
    jvm安全退出
    关于jvm client 与 jvm server 有什么区别, 如何启动jvm client
    微信小程序云开发教程——墨刀原型工具入门(添加交互事件)
    4.go语言复合类型简述
  • 原文地址:https://www.cnblogs.com/yueyazhui/p/word_freemarker.html