前端利用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>
学而不思则罔,思而不学则殆!