前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >nodejs提取excel中的信息填充到word文件,批量生成合同

nodejs提取excel中的信息填充到word文件,批量生成合同

原创
作者头像
挥刀北上
修改2021-02-18 17:32:59
2.3K0
修改2021-02-18 17:32:59
举报
文章被收录于专栏:Node.js开发Node.js开发

今天帮别人做一个小工具,需求是这样的,根据excel表格中的信息生成word合同,批量生成,本来这个事是人工完成的,但是合同有200多份,重复工作比较麻烦,看代码:

代码语言:javascript
复制
// 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即可。

这里面还有一个小问题,就是处理今天的数字问题,将小写数字改成大写的,代码如下:

代码语言:javascript
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档