如何在Node.js中读取Excel文件

发布于3/8/2020 来自:「前端知否」微信公众号

您是否需要使用node.js从Excel(.xlsx)电子表格中获取和分析数据?如果遇上了这种需求,那么本文将是一个解决方案。

在本文中,我将重点介绍

  1. 从电子表格文件中读取数据。
  2. 了解如何返回数据。
  3. 在工作簿中获取工作表的列表(名称)。
  4. 指定从哪个工作表获取数据。

读取文件

准备

需要安装node.js。

创建自己喜欢的任何Excel文件,下面是我将在本文中使用的简单文件的屏幕截图。我将文件命名为Data.xlsx。

xxx

我将使用Visual Studio Code(VSCode)。

  1. 打开终端窗口,然后输入npm init。您可以接受默认设置,该默认设置将使用index.js作主入口文件。
  2. 在终端窗口中,安装 read-excel-file 软件包。
npm install read-excel-file

创建一个名为index.js的文件并打开它。

读取Excel文件

将以下代码添加到index.js文件。

const xlsxFile = require('read-excel-file/node');

xlsxFile('./Data.xlsx').then((rows) => {


}

旁注:在require语句中,我们指定了/ node。这很重要,表示我们需要使用的是node版本。因为它也可以在浏览器中使用,如下:

import xlsxFile from 'read-excel-file'

代码

第一行导入包。

第二行读取文件,返回Promise。完成读取后,我们将得到一个数组。

每个数组(回调函数的rows参数)都表示在电子表格中的一行。每一个都有三个数组,分别对应于电子表格的三列。

实际上返回了一个二维数组。

查看原始数据

修改代码,查看从文件中获取的数据。

const xlsxFile = require('read-excel-file/node');

xlsxFile('./Data.xlsx').then((rows) => {
console.log(rows);
console.table(rows);
})

可以使用F5在调试模式中运行此程序,也可以在不进行调试的情况下使用Ctrl + F5运行。

运行之后,我们可以看到读取的数据。

xxx

在这里,我们看到有一个包含五个元素的数组。每个元素都是文件中的一行。每行包含一个包含三个元素的数组。这三个数组对应于我们的列。二维数组。

CRTL+F5

xxx

现在可以更好的看到数组阵列结构。

获取实际数据

现在数据位于数组中,我们可以轻松访问。下面是两种获取数据的方法。

forEach循环

如下修改代码,以查看每条数据及其数据类型。

数据参数包含电子表格单元格条目。

const xlsxFile = require('read-excel-file/node');

xlsxFile('./Data.xlsx').then((rows) => {
rows.forEach((col)=>{
col.forEach((data)=>{
console.log(data);
console.log(typeof data);
})
})
})

目前为止,输出只是一个列表,但是我们可以访问数据并可以验证其数据类型。

xxx

for..in循环

修改代码以使用for…in循环

const xlsxFile = require('read-excel-file/node');

xlsxFile('./Data.xlsx').then((rows) => {
for (i in rows) {
for (j in rows[i]){
console.dir(rows[i][j]);
}
}
})

运行时的输出类似,但是此代码使我们可以更好地了解数组结构以及如何访问数组元素。

rows[i][j]包含每个电子表格单元格中的数据。

处理多张工作表

如果我们有两个名为Dev和Exec的工作表怎么办?

默认情况下,当我们阅读时,将首先阅读第一张表。但是我们可以

  • 获取工作表名称列表
  • 指定要从中获取数据的工作表。

修改后的Excel文件

修改Excel文件Data.xlsx,使其具有两张工作表。

xxx

xxx

获取工作表名称列表

工作表名称作为对象数组返回。每个对象都有结构

{name:"sheetname"}

对于我们的工作表,它将返回数组[[{name:"Dev"},{name:"Exec"}]

如下修改代码以获取工作表列表。

const xlsxFile = require('read-excel-file/node');

xlsxFile('./Data.xlsx', { getSheets: true })
.then((sheets) => {
sheets.forEach((obj) => {
console.log(obj.name);
})
})

在这里,我们传递了对象参数 {getSheets: true}

然后使用forEach循环遍历sheets数组并访问每个对象的name属性。

xxx

指定要从中获取数据的表

为了指定所需的工作表,我们将传递{sheet:xxx}对象参数。这有两种形式。您可以按工作表编号工作表名称指定。要访问工作表2,我们可以使用以下其中一项,

{sheet:2}

{sheet:'Exec'}

如下修改代码,以访问Exec表的数据。

const xlsxFile = require('read-excel-file/node');

xlsxFile('./Data.xlsx', { sheet: 'Exec' })
.then((rows) => {
for (i in rows) {
for (j in rows[i]) {
console.log(rows[i][j]);
}
}
})

xxx

最后

npm软件包完成了读取文件的所有工作,重要的部分是如何返回数据。它以二维数组形式返回。知道这一点后,我们就可以深入了解如何获取数据并进行处理。知道我们可以获得工作表名称后,便可以根据需要处理整个工作簿。

谢谢阅读,编码愉快!