在vue3.0+vite+ts中根据前端word模板下载一个word文件

1.调用方法

function exportDocx() {
      state.docxData.tableData = state.tableData
      const fileUrl = new URL(`../../../../assets/report.docx`, import.meta.url).href
      ExportBriefDataDocx(fileUrl, state.docxData, state.docxData.title+'.docx')
}

2.ExportBriefDataDocx方法的封装

import Docxtemplater from "docxtemplater"
import PizZip from "pizzip"
import JSZipUtils from "jszip-utils"
import { saveAs } from 'file-saver'
import expressions from "angular-expressions"
import { assign } from "lodash"

export default function ExportBriefDataDocx(tempDocxPath, data, fileName) {

  expressions.filters.lower = function(input) {

    if (!input) return input
    // toLowerCase() 方法用于把字符串转换为小写。
    return input.toLowerCase()
  }
  function angularParser(tag) {
    tag = tag
      .replace(/^\.$/, 'this')
      .replace(/(’|‘)/g, "'")
      .replace(/(“|”)/g, '"')
    const expr = expressions.compile(tag)
    return {
      get: function(scope, context) {
        let obj = {}
        const scopeList = context.scopeList
        const num = context.num
        for (let i = 0, len = num + 1; i < len; i++) {
          obj = assign(obj, scopeList[i])
        }
        return expr(scope, obj)
      }
    }
  }
  JSZipUtils.getBinaryContent(tempDocxPath, (error, content) => {
    if (error) {
      console.log(error)
    }

    // 创建一个JSZip实例,内容为模板的内容
    const zip = new PizZip(content)
    // 创建并加载 Docxtemplater 实例对象
    const doc = new Docxtemplater(zip, { parser: angularParser })
    // 设置模板变量的值
    doc.setData(data)
    try {
      // 呈现文档,会将内部所有变量替换成值,
      doc.render()
    } catch (error) {
      const e = {
        message: (error as any).message,
        name: (error as any).name,
        stack: (error as any).stack,
        properties: (error as any).properties

      }
      console.log({ error: e })
      // 当使用json记录时,此处抛出错误信息
      throw error
    }
    // 生成一个代表Docxtemplater对象的zip文件(不是一个真实的文件,而是在内存中的表示)
    const out = doc.getZip().generate({
      type: 'blob',
      mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
    })
    // 将目标文件对象保存为目标类型的文件,并命名
    saveAs(out, fileName)
  })
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容