目录

Nodejs实现excel导出数据的功能

目录

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
// 后台所返回的数据
let result = data || [];
// 遍历组装数据
result.map((item) => {
  xlsxData.push([1, 2, 3]);
});
// 设置每一列的宽度
let option = {
  "!cols": [
    {
      wch: 30,
    },
    {
      wch: 20,
    },
    {
      wch: 20,
    },
  ],
};

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// 后台所返回的数据
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等方式返回的会是乱码的形式。其原因在于,这两种方式的请求发送的数据不一样,后端解析返回头也不一样,异步请求是不能触发下载返回头的。