1.对于一些业务系统,很常见的一个功能就是将数据生成excel导出,其实在nodejs中已经很多优秀的第三方库可以实现这个功能,我这里选择的是node-xlsx这个模块,其实它的本质也是依赖的xlsx这个模块。

2.首先得将你需要的导出的数据组装好,并且设置好没一个列表的宽度,如:

// 后台所返回的数据
let result = data || [];
// 遍历组装数据
result.map(item => {
    xlsxData.push([1, 2, 3]);
});
// 设置每一列的宽度
let option = { 
    '!cols': [{
        wch: 30
    }, {
        wch: 20
    }, {
        wch: 20
    }]
};

3.调用node-xlsx模块的build方法,将数据转换为字节流数据,并设置请求的响应头,下载保存,大致代码如下:

// 后台所返回的数据
let result = data || [];

// 遍历组装数据
result.map(item => {
    xlsxData.push([1, 2, 3]);
});

// 设置每一列的宽度
let option = { 
    '!cols': [{
        wch: 30
    }, {
        wch: 20
    }, {
        wch: 20
    }]
};

// res为express或koa2请求的相应结果,此方法需在express或koa2框架下运行
getXlsxInfo(xlsxData, '渠道粉丝统计数据', option, res);

// 生成Excel表格并下载
function getXlsxInfo(xlsxData, name, option, res) {
    const buffer = xlsx.build([{
        name: 'sheet',
        data: xlsxData
    }], option);
    res.setHeader('Content-Type', 'application/vnd.openxmlformats');
    res.setHeader('Content-Disposition', 'attachment; filename=' + encodeURIComponent(name) + '.xlsx');
    res.end(buffer, 'binary');
}

4.有个坑就是使用这种方式下载,必须是直接访问你所写的nodejs接口地址才能打开下载功能,若使用ajaxfetch等方式返回的会是乱码的形式。其原因在于,这两种方式的请求发送的数据不一样,后端解析返回头也不一样,异步请求是不能触发下载返回头的。