在node中使用xlsx-style完成excel的导出和下载,以及设置样式
程序员文章站
2022-07-04 21:19:00
...
var express = require('express');
var router = express.Router();
//const xlsx = require('xlsx');//原生的xlsx,但不支持表格的样式设置
const _ = require('lodash');//引入lodash辅助工具
const fs = require('fs');//引入fs模块用于读取文件流
const moment = require('moment');//用于时间格式的设置
const xlsx = require('xlsx-style');//选择使用xlsx-style可以设置表格样式
/* GET users listing. */
router.get('/:id', function (req, res, next) {
console.log('接受到的result风格参数 = ', req.params.id);
//excel的导出
//先定义需要导出的字段
let _headers = ['id', 'name', 'age', 'country', 'remark']
let _data = [{
id: '1',
name: '无敌浩克',
age: '17',
country: 'China',
remark: 'hello'
},
{
id: '2',
name: '钢铁侠',
age: '18',
country: 'America',
remark: 'world'
},
{
id: '3',
name: '灭霸',
age: '19',
country: 'CSH',
remark: 'CSDN'
},
{
id: '4',
name: '美国队长',
age: '20',
country: 'CSH',
remark: 'CSDN'
}
];
let headersExport = _headers
.map((v, i) => _.assign({}, { v: v, position: String.fromCharCode(65 + i) + 1 }))
.reduce((prev, next) => _.assign({}, prev, {
[next.position]: {
v: next.v, s: {
alignment: {
horizontal: "center",
vertical: "center"
}
}
}
}), {});
let dataExport = _data
.map((v, i) => _headers.map((k, j) => _.assign({}, { v: v[k], position: String.fromCharCode(65 + j) + (i + 2) })))
.reduce((prev, next) => prev.concat(next))
.reduce((prev, next) => _.assign({}, prev, {
[next.position]: {
v: next.v, s: {
alignment: {
horizontal: "center",
vertical: "center"
}
}
}
}), {});
// 合并 headersExport 和 dataExport
const output = _.assign({}, headersExport, dataExport);
console.log(output.A1);
// 获取所有单元格的位置
const outputPos = _.keys(output);
// 计算出范围
const ref = outputPos[0] + ':' + outputPos[outputPos.length - 1];
// 构建 workbook 对象
const wb = {
SheetNames: ['Sheet'],
Sheets: {
'Sheet': _.assign({}, output, { '!ref': ref })
}
};
const strs = 'output.xlsx';//设置默认的文件名称
// 导出 Excel
xlsx.writeFile(wb, strs);//导出文件
const buffer = fs.readFileSync(strs);//使用fs模块得到流
fs.unlinkSync(strs);//删除生成的文件
//返回浏览器完成下载
res.set('Content-Type', 'application/vnd.openxmlformats');
res.set('Content-Disposition', 'attachment; filename="OKR-' + '(' + moment(Date.now()).format('YYYY-MM-DD HH:mm:ss') + ')' + '.xlsx"');
res.end(buffer, 'binary');
});
router.post('/userPost', (req, res, next) => {
res.download(wb);
});
module.exports = router;
上一篇: css脚本化 使用styleSheets插入css样式
下一篇: 获取非行间样式