6

express中使用node-xlsx插件下载excel表格

 3 years ago
source link: https://segmentfault.com/a/1190000040614995
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

node-xlsx是一个轻量级的excel插件,下载导出excel基本的功能这个插件都能实现,本文记录一下express框架中使用node-xlsx插件下载excel表格的步骤。

情况一、读取本地文件并返回前端excel流文件

这种情况适用于下载excel模板场景,毕竟模板是固定的内容,我们在代码的文件夹中存放一个固定的excel模板,读取并返回即可。

  • 第一步,肯定是要下载安装这个插件npm i node-xlsx
  • 第二步,在对应代码中引入这个插件const xlsx = require('node-xlsx')
  • 第三步,就是在对应的路由url中写对应代码,代码如下:
// excel导出下载模板接口
route.get("/exportExcel", (req, res) => {

  // 首先,读取本地excel模板文件,并解析成node-xlsx插件需要的数据格式,
  // (比如我的表格文件在代码中的excel文件夹下)要引入fs文件模块才能读取哦
  const dataByParse = xlsx.parse(fs.readFileSync('./excel/统计模板.xlsx'));

  /* 
     打印出来的数据是一个数组,数组中的每一项(每一个对象)都是一个sheet数据,name属性指定的是每一个sheet的名字
     data属性是一个数组,数组中存放的是表格对应每个sheet的数据,data数组中的第一项是“表头”的数据,也可以理解为是
     第一行的数据,后面的每一项就是对应每一行“表体”的数据,具体格式,后续也会举例。
  */ 
  console.log("解析数据格式",dataByParse);

  // 最后一步,使用xlsx插件自带的build方法将解析后的数据转换成为excel表格(buffer形式的流文件)
  // 以流文件的形式返回给前端,前端接收解析下载即可
  res.send(xlsx.build(dataByParse))

})

node-xlsx需要的数据格式举例子

比如这样的数据格式,我们看一下数据结构

let excelData = [
    // 第一个sheet内容
    {
      name:"我是sheet1", // 给第一个sheet指名字 
      data:[  // 注意,这里是一个二维数组
        ["姓名","年龄","家乡","备注"], // 第一行
        ["孙悟空","500","花果山","人送外号斗战胜佛"], // 第二行
        ["猪八戒","88","高老庄","天蓬元帅"], // 第三行
      ]
    },
    // 第二个sheet内容
    {
      name:"我是sheet2", // 给第二个sheet指名字 
      data:[
        ["城市","国家","人口","经济水平"], // 同上
        ["上海","中国","14亿","越来越好"],
        ["伦敦","英国","7000万","还行"],
        ["华盛顿","美国","3.4亿","凑活"]
      ]
    }
  ]

上述数据格式对应效果图

很显然,数据结构和对应导出的excel结果都是对应的

情况二、根据前端传递参数,查询mysql数据并返回前端流文件

这种情况适用于,一次性的表格文件下载。不会占用后端磁盘文件。就是接收前端传递来的参数,然后把参数拼接sql语句。最终把数据结构组装成node-xlsx插件需要的数据格式即可

// excel导出下载模板接口
route.post("/exportExcel", (req, res) => {
  // 假设我们mysql数据库查询得到了excelData这个数据结果
  let excelData = [
    // 第一个sheet内容
    {
      name: "我是sheet1", // 给第一个sheet指名字 
      data: [
        ["姓名", "年龄", "家乡", "备注"], // 第一行
        ["孙悟空", "500", "花果山", "人送外号斗战胜佛"], // 第二行
        ["猪八戒", "88", "高老庄", "天蓬元帅"], // 第三行
      ]
    },
    // 第二个sheet内容
    {
      name: "我是sheet2", // 给第二个sheet指名字 
      data: [
        ["城市", "国家", "人口", "经济水平"], // 同上
        ["上海", "中国", "14亿", "越来越好"],
        ["伦敦", "英国", "7000万", "还行"],
        ["华盛顿", "美国", "3.4亿", "凑活"]
      ]
    }
  ]

  // excel表格内容配置单元格宽度
  let optionArr = { 
    // 指定sheet1相应宽度
    "!cols": [
      { wch: 15 },
      { wch: 15 },
      { wch: 10 },
      { wch: 50 },
    ],
    // 指定sheet2相应宽度
    "cols": [
      { wch: 15 },
      { wch: 15 },
      { wch: 10 },
      { wch: 50 },
    ],
  }

  // xlsx.build方法第二个参数接收的是单元格的配置参数
  res.send(xlsx.build(excelData,optionArr))
})

本文记录的主要是后端方面的代码写法,至于前端的下载excel表格的写法和注意事项常见问题,可以参考我的另外一篇文章,传送门如下:https://segmentfault.com/a/11...

最后附上npmjs官方网站的文档实例介绍,更加齐全哟:https://www.npmjs.com/package...


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK