今天帮别人做一个小工具,需求是这样的,根据excel表格中的信息生成word合同,批量生成,本来这个事是人工完成的,但是合同有200多份,重复工作比较麻烦,看代码:
// console.clear();
var PizZip = require('pizzip');
var Docxtemplater = require('docxtemplater');
var fs = require('fs');
var path = require('path');
var xl = require('xlsx');
var transCnMoney = require('./translatemoney');
var workbook = xl.readFile("./data.xls")
//var dataa =xl.utils.sheet_to_json(worksheet);
const sheetNames = workbook.SheetNames; // 返回 ['sheet1', 'sheet2']
// 根据表名获取对应某张表
const worksheet = workbook.Sheets[sheetNames[0]];
var dataa = xl.utils.sheet_to_json(worksheet);
// console.log(dataa);
let distdata = [
]
for (let i = 0; i < dataa.length; i++) {
const element = dataa[i];
let obj = {
znume: element['新编号'],
name:element['姓名'],
shengennum: element['身份证'],
telphone: element['联系电话'],
money: element['发放金额(元)'],
bankname: element['银行户名'],
bank: element['开户银行'],
banknum: element['银行卡卡号(本人)'],
bignoney: transCnMoney(element['发放金额(元)']),
}
distdata.push(obj)
}
// console.log(distdata)
// // 读取文件,以二进制文件形式保存
var content = fs.readFileSync(path.resolve(__dirname, 'simple1.docx'), 'binary');
// 压缩数据
var zip = new PizZip(content);
var doc = new Docxtemplater(zip);
for (let i = 0; i < distdata.length; i++) {
const element = distdata[i];
// var doc = new Docxtemplater(zip);
// 设置填充数据
doc.setData(
{
name: element.name,
shengennum: element.shengennum,
telphone: element.telphone||"",
money: element.money,
bignoney: element.bignoney,
bankname: element.bankname,
bank: element.bank,
banknum: element.banknum,
}
);
//渲染数据生成文档
doc.render()
// 将文档转换文nodejs能使用的buf
var buf = doc.getZip().generate({ type: 'nodebuffer' });
fs.writeFileSync(path.resolve(__dirname, 'hetong',`${element.znume}${element.name}-基金会捐赠道童村个人协议.docx`), buf);
}
console.log("ok")
步骤很简单,先读取excel中的信息,然后将信息填充到word中,这里需要注意的是word文档的模板生成是在for循环的外面,之后每次填充数据只需要调用setData即可。
这里面还有一个小问题,就是处理今天的数字问题,将小写数字改成大写的,代码如下:
function transCnMoney(number) {
var CN_MONEY = "";
var CN_UNIT = "仟佰拾亿仟佰拾万仟佰拾元角分";
number = parseFloat(number).toFixed(2).toString();//浏览器默认为整数型,将数字转为2位有效数字的float类型再转为字符串
var dot = number.indexOf('.');//将从小数点开始分开
if (dot >= 0) {
number = number.substring(0, dot) + number.substr(dot + 1, 2);
CN_UNIT = CN_UNIT.substr(CN_UNIT.length - number.length);
for (var i = 0; i < number.length; i++) {
CN_MONEY += '零壹贰叁肆伍陆柒捌玖'.substr(number.substr(i, 1), 1) + CN_UNIT.substr(i, 1);
}
return CN_MONEY.replace(/零角零分$/, '整').replace(/零[仟佰拾]/g, '零').replace(/零{2,}/g, '零').replace(/零([亿|万])/g, '$1').replace(/零+元/, '元').replace(/亿零{0,3}万/, '亿').replace(/^元/, "零元");
} else {
}
}
module.exports = transCnMoney
希望对你有所帮助。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。