前端利用JSZipUtils将前端状态数据填入word模板中的

public文件夹下存入模板文件

"file-saver": "^2.0.5",
"jszip-utils": "^0.1.0",
 "pizzip": "^3.1.4",
 "docxtemplater": "^3.42.7",
<template>
  <div>
  </div>
</template>

<script setup>
import {reactive, defineExpose} from 'vue'
import Docxtemplater from 'docxtemplater';
import JSZip from 'jszip';
import JSZipUtils from 'jszip-utils';
import { saveAs } from 'file-saver';

const state = reactive({
  exportData: null, // 导出的word数据
  fileTemplate: '', // public下存放的word模板名称
  fileName: '' // 输出文件名
})

const exportWord = () => {
  console.log('output-> word导出', )
  let targetFileName = ''
  if(state.fileTemplate === 'xxx') {
    targetFileName = 'zxdc'
  }
  if(state.fileTemplate === 'xxx') {
    targetFileName = 'sjdc'
  }
  if(state.fileTemplate === 'xxx') {
    targetFileName = 'tshc'
  }
  if(state.fileTemplate === 'xxx') {
    targetFileName = 'szdc'
  }
  if(state.fileTemplate === 'xxx') {
    targetFileName = 'xcdc'
  }
  if(state.fileTemplate === 'xxx') {
    targetFileName = 'spdc'
  }
  if(state.fileTemplate === 'xxx') {
    targetFileName = 'jqwh'
  }

  // 读取并获得模板文件的二进制内容
  JSZipUtils.getBinaryContent(`${targetFileName}.docx`, (error, content) => {
    // 抛出异常
    if (error) throw error;
    // 创建一个JSZip实例,内容为模板的内容
    let zip = new JSZip(content);
    // 创建并加载docxtemplater实例对象
    let doc = new Docxtemplater();
    doc.loadZip(zip);
    // 设置模板变量的值
    doc.setData({
      ...state.exportData
    });
    try {
      // 用模板变量的值替换所有模板变量
      doc.render();
    } catch (error) {
      // 抛出异常
      let e = {
        message: error.message,
        name: error.name,
        stack: error.stack,
        properties: error.properties
      };
      console.log(JSON.stringify({ error: e }));
      throw error;
    }
    // 生成一个代表docxtemplater对象的zip文件(不是一个真实的文件,而是在内存中的表示)
    let out = doc.getZip().generate({
      type: 'blob',
      mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
    });
    // 将目标文件对象保存为目标类型的文件,并命名
    saveAs(out, state.fileName + '.docx');
  });
}

defineExpose(
  {
    exportWord,
    state
  }
)
</script>

posted @ 2024-03-27 15:22  Felix_Openmind  阅读(462)  评论(0编辑  收藏  举报