node.js 导出excel

最近刚学习了node.js。然后需要做一个列表页面点导出然后导出成excel。在网上找了好多方法。不是不能用。就是不理解。找了好久。最后找到了一篇这个文章:

https://github.com/functionscope/Node-Excel-Export。终于琢磨着做完了。这个不需要在服务器端生成一个excel。感觉很好。不啰嗦了。直接写步骤:

1,安装npm install excel-export.

2,后台方法:

 var startInTime = new moment('1900-01-01 00:00:00.000Z');
        var endInTime = new moment();
        var parkName = req.body.parkName;
        var carNo = req.body.carNo;
        var whereClause = {};
        var andValue = [];
        if (req.body.dateInRange!== "") {
            var start = req.body.dateInRange.split('-')[0].replace(/(^\s*)|(\s*$)/g, "");
            var end = req.body.dateInRange.split('-')[1].replace(/(^\s*)|(\s*$)/g, "");
            startInTime = start;
            endInTime = end;
            andValue.push({ time: { gte: startInTime } });
            andValue.push({ time: { lte: endInTime } });
        }
        if (parkName!== "") {
            andValue.push({ pname: { like: parkName } });
        }
        if (carNo !== "") {
            andValue.push({ vno: { like: carNo } });
        }
        if (andValue.length !== 0) {
            whereClause.and = andValue;
        } else {
            whereClause = null;
        }//以上为查询条件
        Trasaction.find({
            fields: { vno: true, pname: true, paytool: true, paytoolseq: true, charge: true , tsubjname: true, time: true, id: true, detime: true, discount: true, tsubjtype: true, state: true },
            where: whereClause,
            order: "time desc",
        }, function (err, trasations) {
            if (err)
                return err;

//以上为查询数据库数据。各位可以自己修改。关键是以下的代码。
            var nodeExcel = require('excel-export');
            var conf = {};
            conf.stylesXmlFile = "styles.xml";//注意:这个文件需要去我刚刚发的那个网址上下载一个下来。
            conf.name = "mysheet";

//设置表头

            conf.cols = [{
                    caption: '车牌号',
                    type: 'string',
                    //beforeCellWrite: function (row, cellData) {
                    //    return cellData.toUpperCase();
                    //},
                    width: 10.6
                }, 
            {
                    caption: '停车场',
                    type: 'string',
                    width: 28
            }, {
                    caption: '交易工具',
                    type: 'string',
                    width: 10
                }, {
                    caption: '交易流水',
                    type: 'string',
                    width:35
                },{
                    caption: '交易时间',
                    type: 'string',
                    width: 28
                },{
                    caption: '金额',
                    type: 'string',
                    width:8
                }, {
                    caption: '减免小时数',
                    type: 'string',
                    width: 11
                }, {
                    caption: '折扣数',
                    type: 'string',
                    width: 9
                }, {
                    caption: '交易主体名称',
                    type: 'string',
                    width:12
                }, {
                    caption: '交易主体类型',
                    type: 'string',
                    width: 18
                }, {
                    caption: '状态',
                    type: 'string'
                }
];

//以下为将数据封装成array数组。因为下面的方法里头只接受数组。
            var vac = new Array();
            for (var i = 0; i < trasations.length; i++) {
                var temp = new Array();
                temp[0]= trasations[i].vno+"";
                temp[1]= trasations[i].pname+"";
                temp[2] = trasations[i].paytool || "现金";
                temp[3] = trasations[i].paytoolseq || "无";
                temp[4] = Common.dateFormat(trasations[i].time, "yyyy-MM-dd hh:mm:ss", "") + "";
                temp[5] = Math.abs(trasations[i].charge)+"";
                temp[6] = trasations[i].detime+"";
                temp[7] = trasations[i].discount || "无";
                temp[8] = trasations[i].tsubjname || "";
                temp[9] = trasations[i].tsubjtype || "";
                temp[10] = (trasations[i].state) == "0"?"未付款或未持久化":"已付款或已持久化";
                vac.push(temp);
            };
            conf.rows = vac;//conf.rows只接受数组
            var result = nodeExcel.execute(conf);
            res.setHeader('Content-Type', 'application/vnd.openxmlformats');
            res.setHeader("Content-Disposition", "attachment; filename=" + "transaction.xlsx");
            res.end(result, 'binary');
        });

3,前台调用。我刚开始调用的时候用的是ajax,然后程序也能执行。但是就是页面没有一点反应。后来查了下才明白ajax的返回类型里并没有stream。从网上找了个方法:就是模拟了一个提交。                            var form = $("<form>");//定义一个form表单
            form.attr("style", "display:none");
            form.attr("target", "");
            form.attr("method", "post");
            form.attr("id", "toexcel");
            form.attr("action", "/manage/operate/toexcel");
            var input1 = $("<input>");
            input1.attr("type", "hidden");
            input1.attr("name", "parkName");
            input1.attr("id", "parkName");
            input1.attr("value", $('#parkSelect').val());
            var input2 = $("<input>");
            input2.attr("type", "hidden");
            input2.attr("name", "dateInRange");
            input2.attr("id", "dateInRange");
            input2.attr("value", $('#vaccessInDaterange').val());
            var input3 = $("<input>");
            input3.attr("type", "hidden");
            input3.attr("name", "carNo");
            input3.attr("id", "carNo");
            input3.attr("value", $('#carNo').val());
            $("body").append(form);//将表单放置在web中
            form.append(input1);
            form.append(input2);
            form.append(input3);
            form.submit();//表单提交

4,这样就可以了呀。累死本宝宝了。如此菜鸟。可怜可叹。加油吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值