前端导出Word

237 阅读2分钟

最近有个简历导出Word的需求,作者学习了下纯前端的导出Word。主要使用 docxtemplaterjszip-utils,jszip,file-saver,docxtemplater-image-module-free依赖包。

安装与简介

npm install docxtemplater jszip-utils jszip file-saver docxtemplater-image-module-free

docxtemplater 支持生成 docx, pptx,xlsx文件
jszip 一个使用 JavaScript 创建、读取和编辑 .zip 文件的库
jszip-utils 与 JSZip 配套的跨浏览器工具集
file-saver FileSaver.js 是在客户端保存文件的解决方案,非常适合在客户端生成文件的 Web 应用程序
docxtemplater-image-module-free 用于处理图片

使用

语法

  • {name} 文本
  • {#loop} {/loop} 循环
  • {#condition} {/condition} 判断
  • {%src_url} 图片
  • {@input} XML插入
  • ......

模板 Snipaste_2025-05-09_14-17-45.png

Snipaste_2025-05-09_14-33-34.png

Snipaste_2025-05-09_14-18-09.png

代码实现

const generateDoc = function () {
  JSZipUtils.getBinaryContent(
    'xxxxxx', // 可以是本地路径也可以通过URL获取模板文件,base64也可
    function (error, content) {
      if (error) {
        console.error(error)
        return
      }
      var opts = {}
      opts.centered = false
      // 有图片需要配置 getImage,getSize
      opts.getImage = function (tagValue, tagName) {
        // tagValue is "https://docxtemplater.com/xt-pro-white.png" and tagName is "image"
        return new Promise(function (resolve, reject) {
          JSZipUtils.getBinaryContent(tagValue, function (error, content) {
            if (error) {
              return reject(error)
            }
            return resolve(content)
          })
        })
      }
      // 设置图片尺寸
      opts.getSize = function (img, tagValue, tagName) {
        // FOR FIXED SIZE IMAGE :
        return [150, 150]

        // FOR IMAGE COMING FROM A URL (IF TAGVALUE IS AN ADRESS) :
        // To use this feature, you have to be using docxtemplater async
        // (if you are calling setData(), you are not using async).
        return new Promise(function (resolve, reject) {
          var image = new Image()
          image.src = url
          image.onload = function () {
            resolve([image.width, image.height])
          }
          image.onerror = function (e) {
            console.log('img, tagValue, tagName : ', img, tagValue, tagName)
            alert('An error occured while loading ' + tagValue)
            reject(e)
          }
        })
      }

      var imageModule = new ImageModule(opts)

      var zip = new JSZip(content)
      var doc = new docxtemplater().loadZip(zip).attachModule(imageModule).compile()

      doc
        .resolveData({
          image: 'xxxxxxxx',
          name: '彭于晏',
          sex: '男',
          study: [
              {
                  time: '2000/09/01-2010/09/01',
                  school: '北大',
                  experience: '怀念在清华的日子'
              },
              {
                  time: '2020/09/01-2030/09/01',
                  school: '清华',
                  experience: '怀念在北大的日子'
              }
          ]
        })
        .then(function () {
          console.log('ready')
          doc.render()
          // 这块内容无需理会
          var out = doc.getZip().generate({
            type: 'blob',
            mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
          })
          // 导出文件
          saveAs(out, 'generated.docx')
        })
    },
  )
}

最后效果图

Snipaste_2025-05-09_14-34-38.png

Snipaste_2025-05-09_14-34-45.png

上述的代码示例仅是较为基础的使用示例,如果对前端生成某些格式的文件感兴趣或有需求可前往docxtemplater官网进行深入学习。

感谢看到最后~
  ①如果你持有不同的看法,欢迎你在文章下方进行留言、评论。
  ②如果对你有帮助,或者你认可的话,欢迎给个小点赞,支持一下~ 

(文章内容仅供学习参考,如有侵权,非常抱歉,请立即联系作者删除。)