您的位置:首页 > Web前端 > Node.js

node.js 导出excel

2016-03-10 16:21 591 查看
最近刚学习了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,这样就可以了呀。累死本宝宝了。如此菜鸟。可怜可叹。加油吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: