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,这样就可以了呀。累死本宝宝了。如此菜鸟。可怜可叹。加油吧。
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,这样就可以了呀。累死本宝宝了。如此菜鸟。可怜可叹。加油吧。
相关文章推荐
- node.js环境
- convertToNodeSpace和convertToWorldSpace
- Jquery通过ajax请求NodeJS返回json数据
- [转]Node-Webkit配合HTML5实现拍照功能
- 关于MonoDevelop5.9.6_使用总结
- Nodejs 一个简单的后台实例
- 一个由INode节点爆满引起的业务故障
- 关于影响NodeManager执行MR任务constainer数量的设置问题
- Node.js之Console用法小结
- 文件系统(node.js学习笔记)
- NodeJs之npm
- Node debug
- nodejs中的加密模块 crypto 模块
- Node.js、Express框架获取客户端IP地址
- Node.js
- WebStorm配置Node.js IDE
- LeetCode 19. Remove Nth Node From End of List
- inode和文件描述符区别
- [leetcode 116] Populating Next Right Pointers in Each Node---层序遍历标记每一层的末尾
- Hadoop之Secondary NameNode