前言:
node表格导出excel的方式有好几种,现在还在持续更新的只有node-xlsx excel-export:
(1)js-xlsx : 入口
目前 Github 上 star 数量最多的处理 Excel 的库,支持解析多种格式表格XLSX / XLSM / XLSB / XLS / CSV,解析 采用纯js实现,写入需要依赖nodejs或者FileSaver.js实现生成写入Excel,可以生成子表Excel,功能强大,但上手难度稍大。不提供基础设置Excel表格api例单元格宽度,文档有些乱,不适合快速上手
(2)node-xlsx :入口
基于Node.js解析excel文件数据及生成excel文件,仅支持xlsx格式文件;
(3)excel-parser : 入口
基于Node.js解析excel文件数据,支持xls及xlsx格式文件,需要依赖python,太重不太实用;
(4)excel-export : 入口
基于Node.js将数据生成导出excel文件,生成文件格式为xlsx,可以设置单元格宽度,API容易上手,无法生成worksheet字表,比较单一,基本功能可以基本满足;
(5)node-xlrd :
基于node.js从excel文件中提取数据,仅支持xls格式文件,不支持xlsx,有点过时,常用的都是XLSX 格式。
具体使用-excel-export :
步骤一:安装插件excel-export
cnpm i -s excel-export
步骤二:在js文件中引入
var nodeExcel = require('excel-export');
步骤三:具体使用,方法一是写固定的,方法二是查表的
/**
* 下载excel
* */
router.get('/excel', function(req, res){
var name = encodeURI('测试表');
var conf ={};
conf.name = "aaa";//表下面名字,默认不能为中文
/**
* 表头数据
* */
let colsArr = [
// {
// caption:'姓名',
// type:'string',
// },{
// caption:'日期',
// type:'date',
// },{
// caption:'类型',
// type:'bool'
// },{
// caption:'手机号码',
// type:'number'
// }
{
caption:'序号',
type:'number',
},
{
caption:'id',
type:'string',
},
{
caption:'name',
type:'string',
},
];
conf.cols = colsArr;
/**
* 表内容数据
* */
let data = [
{
id:'1',
name:'zwh'
},{
id:'222',
name:'dddd'
},{
id:'839',
name:'23ddg'
}
]
let array =[];
for(var i=0; i<data.length; i++){
var temp = new Array();
temp[0] = i+1;
temp[1] = data[i].id;
temp[2] = data[i].name;
array.push(temp);
}
conf.rows = array
var result = nodeExcel.execute(conf);
res.setHeader('Content-Type', 'application/vnd.openxmlformats;charset=utf-8');
// res.setHeader("Content-Disposition", "attachment; filename=" + "Report.xlsx");
res.setHeader("Content-Disposition", "attachment; filename=" + name + ".xlsx");
res.end(result, 'binary');
});
/**
* 下载table表格
* */
router.get('/tableDown', function(req, res){
//模糊查询的sql SELECT * FROM bloginformation WHERE blogTitle LIKE ? OR blogContent LIKE ? OR blogLable LIKE ?
var params = req.query || req.params;
let sql = "SELECT * FROM `table`"; //查询列表所有的数据
let content = [];
let isMore = false;//是否有多个查询参数
if(params.name){
// 模糊查询两种方法直接在SQL语句后加 mysql.escape("%"+req.body.name+"%")
// sql += " WHERE product_name LIKE "+mysql.escape("%"+req.body.name+"%")
sql += " WHERE name LIKE ?";
content.push( "%"+params.name+"%" );
isMore = true;
}
if(params.age){
if(isMore){//true代表有多个参数
sql += "and age like ?";//and是两个条件都必须满足,or是或的关系
}else{
sql += " WHERE age LIKE ?";
}
content.push( "%"+params.age+"%" );
}
if(params.page || params.page_size){//开启分页
let current = params.page;//当前页码
let pageSize = params.page_size;//一页展示多少条数据
sql += " limit ?,?";
content.push((current-1)*pageSize,parseInt(pageSize));
}
db.query(sql, content,function(result,fields){
var name = encodeURI('人员表');
var conf ={};
// conf.name = "aaa";//表下面名字,默认不能为中文
/**
* 表头数据-类型必须和数据库要对的上
* */
let colsArr = [
{caption:'序号',type:'number'},
{caption:'id',type:'number'},
{caption:'name',type:'string'},
{caption:'age',type:'number'},
{caption:'phone',type:'string'},
];
conf.cols = colsArr;
/**
* 表内容数据
* */
let array =[];
result.forEach((item,index)=>{
var temp = [];
temp.push(index);
temp.push(item.id);
temp.push(item.name);
temp.push(item.age);
temp.push(item.phone);
array.push(temp);
})
conf.rows = array;
console.log(array);
var result = nodeExcel.execute(conf);
res.setHeader('Content-Type', 'application/vnd.openxmlformats;charset=utf-8');
res.setHeader("Content-Disposition", "attachment; filename=" + name + ".xlsx");
res.end(result, 'binary');
});
});