首页 > 语言 > JavaScript > 正文

Node.js利用js-xlsx处理Excel文件的方法详解

2024-05-06 15:14:50
字体:
来源:转载
供稿:网友

简介

本文介绍用 Node.js 中的 js-xlsx 库来处理 Excel 文件。

js-xlsx 库是目前 Github 上 star 数量最多的处理 Excel 的库,功能强大,但上手难度稍大。文档有些乱,不适合快速上手。

本文对 js-xlsx 库进行一定的总结,并提供几个实用的例子供读者测试,学习,交流。

安装

$ npm install xlsx

一些概念

在使用这个库之前,先介绍库中的一些概念。

workbook 对象,指的是整份 Excel 文档。我们在使用 js-xlsx 读取 Excel 文档之后就会获得 workbook 对象。 worksheet 对象,指的是 Excel 文档中的表。我们知道一份 Excel 文档中可以包含很多张表,而每张表对应的就是 worksheet 对象。 cell 对象,指的就是 worksheet 中的单元格,一个单元格就是一个 cell 对象。

它们的关系如下:

// workbook{ SheetNames: ['sheet1', 'sheet2'], Sheets: { // worksheet 'sheet1': {  // cell  'A1': { ... },  // cell  'A2': { ... },  ... }, // worksheet 'sheet2': {  // cell  'A1': { ... },  // cell  'A2': { ... },  ... } }}

用法

基本用法

XLSX.readFile 打开 Excel 文件,返回 workbook 用 workbook.SheetNames 获取表名 用 workbook.Sheets[xxx] 通过表名获取表格 按自己的需求去处理表格 生成新的 Excel 文件

具体用法

读取 Excel 文件

import XLSX from 'xlsx';const workbook = XLSX.readFile('someExcel.xlsx', opts);

获取 Excel 文件中的表

// 获取 Excel 中所有表名const sheetNames = workbook.SheetNames; // 返回 ['sheet1', 'sheet2']// 根据表名获取对应某张表const worksheet = workbook.Sheets[sheetNames[0]];

通过 worksheet[address] 来操作表格,以 ! 开头的 key 是特殊的字段。

// 获取 A1 单元格对象let a1 = worksheet['A1']; // 返回 { v: 'hello', t: 's', ... }// 获取 A1 中的值a1.v // 返回 'hello'// 获取表的有效范围worksheet['!ref'] // 返回 'A1:B20'worksheet['!range'] // 返回 range 对象,{ s: { r: 0, c: 0}, e: { r: 100, c: 2 } }// 获取合并过的单元格worksheet['!merges'] // 返回一个包含 range 对象的列表,[ {s: { r: 0, c: 0 }, c: { r: 2, c: 1 } } ]

实战

解析 Excel 生成 JSON

Tips 事实上,你可以直接通过 XLSX.utils.sheet_to_json(worksheet) 获得同样的结果

注意 本例子中假设表的第一行为字段名

const headers = {};const data = [];const keys = Object.keys(worksheet);keys // 过滤以 ! 开头的 key .filter(k => k[0] !== '!') // 遍历所有单元格 .forEach(k => {  // 如 A11 中的 A  let col = k.substring(0, 1);  // 如 A11 中的 11  let row = parseInt(k.substring(1));  // 当前单元格的值  let value = worksheet[k].v;  // 保存字段名  if (row === 1) {   headers[col] = value;   return;  }  // 解析成 JSON  if (!data[row]) {   data[row] = {};  }  data[row][headers[col]] = value; });console.log(data); // [ { '姓名': 'test1', '年龄': 20 }, { '姓名': 'test2', '年龄': 10 } ... ]            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选