天天看點

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,這樣就可以了呀。累死本寶寶了。如此菜鳥。可憐可歎。加油吧。

繼續閱讀