这几天一个朋友需要处理公司的很多合同找我帮忙,闲暇的时候给帮他研究了一下,批量处理解放她的双手。因为我是一个前端开发,会一些node 这里就有node进行开发。
这里需要用到 pizzip docxtemplater node-xlsx 依赖包,可以在官网查看!!!
上代码前,先说下逻辑处理流程
首先编辑模板,在js中读取,并对模板数据进行压缩
同时再获xlsx数据,对xlsx数据行一些处理
之后通过Docxtemplater生成模板文档,对模板文档进行赋值
并渲染出新的文档,将文档转换文nodejs能使用的buf
最后输出文档
流程梳理好了,那我们开始上代码
第1步.先对我们的word模板进行编辑,如下:
第2步.然后就可以对word进行读取并进行压缩了,这里读取的文件是二进制形式
var content = fs.readFileSync(path.resolve(__dirname, './合同模板.docx'), 'binary');
var zip = new PizZip(content);
第3步.读取xlsx的数据,并将数据赋值给data
注:cellDates读取的是xlsx时间格式,可以按照需要进行格式编辑
const mysql = nodeXlsx.parse("./mysql.xlsx",{ cellDates: true})
var data = mysql[0].data
第4步.接下来就是将读取的二进制数据生成模板文档
var doc = new Docxtemplater(zip);
第5步.然后就是对生成的模板进行赋值了,需要注意的是这里赋值的参数要与word中{}参数一致
doc.setData({
name: e[0],
stime: formatDate(e[3]),
etime:formatDate(e[4]),
end: formatDate(e[3])
});
第6步.因为xlsx获取的是时间格式所以我们要多时间进行一些处理
function formatDate(numb) {
let time = new Date(numb)
let year = time.getFullYear() + ''
let month = time.getMonth() +1<10?'0'+(time.getMonth() +1):time.getMonth() +1+''
let date = time.getDate()<10?'0'+time.getDate():time.getDate() + ''
return year + "/" + month + "/" + date
}
第7步.对填充后的数据进行渲染
doc.render()
第8步.将文档转换成nodejs能使用的buf
var buf = doc.getZip().generate({ type: 'nodebuffer' });
第9步.最后就是进行输出文件了
fs.writeFileSync(path.resolve(__dirname, `./word/${e[1]}.docx`), buf);
到这一步已经全部流程结束了,但是前面说了,我们是批量合同生成,所以我们要有一步就是将4,5,6,7,8,9写在一个函数里并进行循环遍历
data.forEach(res => {
addWord(res)
})
到这里就是完整的步骤了。
很高兴在这里分享给大家文档,这也是第一次写文档,有写的不好的地方还望多多包涵!!!