前言:对于一个后台管理系统而言,可视化展现数据是必不可少的一部分,而将这些数据导出为Excel可打开的文件的需求可很常见,如果前端把所有数据一次性拿到的话,这个需求可以在前端完成,但是对于做了分页处理的后台管理系统而言,前端并不是一次性拿到所有数据,而这时需要一次性导出所有表格数据(包括还没有加载到前端的数据),那么肯定是后台操作比较好。
exceljs
直接上代码,还是很好懂的。测试数据:
let data = [{
id: 1,
name: '张三',
birth: new Date(1994,2,14)
},{
id: 2,
name: '李四',
birth: new Date(1995,8,24)
},{
id: 3,
name: '王五',
birth: new Date(1991,10,10)
},{
id: 4,
name: '周六',
birth: new Date(1992,7,1)
}];
node.js代码:
const Excel = require('exceljs');
const http = require('http');
const url = require('url');
http.createServer( async (req, res) => {
if(req.method == 'GET' && req.url == '/xlsx') {
res.writeHead(200, {
"Content-Type": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", //xlsx 文件制定类型
"Access_Control-Allow-Origin": "*",
"Content-Disposition": "attachment; filename=" + new Buffer('测试excel.xlsx').toString('binary'), // 设置文件名称
});
try {
const workbook = new Excel.Workbook(); // 创建一个Workbook对象
const worksheet = workbook.addWorksheet('My Sheet'); // 创建一个worksheet并命名
worksheet.columns = [ // 设置列表属性
{ header: '编号', key: 'id', width: 8 },
{ header: '姓名', key: 'name', width: 12 },
{ header: '生日', key: 'birth', width: 25 },
{ header: '隐藏列', key: 'hidden', width: 20 }
];
// 行、列均从1开始计数,header作为第一行数据
worksheet.addRows(data); // 写入json数组数据
worksheet.addRow([5,'朱八',new Date(1999,9,6), 12345]); // 单独添加一行数据
const hiddenCol = worksheet.getColumn('hidden'); // 获取列
hiddenCol.hidden = true; // 隐藏列
const row5 = worksheet.getRow(5); // 获取第5行
row5.height = 50; // 设置第5行的高度
await workbook.xlsx.write(res); // 写入数据
res.end();
} catch(error) {
console.log(error);
res.end('error');
}
}
}).listen(8000,'127.0.0.1');
可以看到能够很方便的设置宽高,是否隐藏等属性,操作数据库也挺自然,下图是最后的效果:
除此之外,exceljs对于某行,某列,某个具体的单元格都可以灵活的设置其样式(是否加粗,宽高,边距,颜色等等)或者统计行列,合并单元格等等,是非常优秀的一个库。