1. 功能实现所依赖的库,同时在electron环境下依赖fs path
两大模块
npm install --save docxtemplater pizzip
详细官网文档参考:https://docxtemplater.com/docs/get-started-node/
2. 详细实现如下(直接贴完成代码):
const { dialog } = require('electron');
const path = require('path');
const fs = require('fs');
const Docxtemplater = require('docxtemplater');
const PizZip = require('pizzip');
ipcMain.handle('save-docx-file', (_, data) => {
return new Promise((resolve) => {
console.log(data);
// #start 获取模板文件, 当前代码亦可使用jszip-utils库进行读取
let filePath = path.join(process.cwd(),'/resources/config/templete.docx');
if (process.env.NODE_ENV === 'development') {
filePath = path.join(__dirname, './config/templete.docx');
}
const content = fs.readFileSync(filePath, 'binary');
// #end
const zip = new PizZip(content);
const doc = new Docxtemplater(zip, {
paragraphLoop: true,
linebreaks: true,
});
doc.setData({
});
// 设置模板中变量的值
doc.setData({
index: 2,
processCode: 'Process0555555555555555555',
p1_1: 9999.66,
p1_2: true,
userId: '9d1a7811',
uploadTime: '2023-08-03T16:31:47+08:00',
remark: 'BBB',
first_name: '测试模板',
last_name: '测试模板',
});
doc.render(); // 同一个doc下只能执行一次
const buf = doc.getZip().generate({
type: 'nodebuffer',
compression: 'DEFLATE',
});
// 使用electron 获取用户所选择的保存目录路径,具体文档参考官网文档
[selectedPath] = dialog.showOpenDialogSync(mainWindow, {
title: '请选择保存目录',
properties: ['openDirectory', 'createDirectory'], // 允许选择单个文件夹目录
});
if (!selectedPath) {
{
return resolve([{ msg: '操作失败!' }, null]);
}
}
const targetPath = path.join(selectedPath, 'success.docx');
fs.writeFile(targetPath, buf, (err) => {
if (err) {
return resolve([{ msg: '操作失败!' }, null]);
}
return resolve([null, targetPath]);
});
});
});