简介
本文介绍用 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 } ... ]
合并表格
步骤:
- 读取多份表格
- 合并数组
Tips: 其实合并表格跟 XLSX 没什么关系,只是处理几个数组而已。
sheet1
id
name
age
1
test1
30
2
test2
20
3
test3
18
sheet2
id
country
remark
1
China
hello
2
America
world
3
Unkonw
"htmlcode">
let sheet1 = XLSX.utils.sheet_to_json(sheet1); let sheet2 = XLSX.utils.sheet_to_json(sheet2); // 先合并 sheet1 和 sheet2,再对统一处理 const result = sheet1.concat(sheet2).reduce((prev, next) => { let index = prev.findIndex((elem, i) => elem.id === next.id); if (index === -1) { return prev.concat(next); } else { prev[index] = Object.assign({}, prev[index], next); return prev; } }, []); console.log(result); // [ { id: '1', // name: 'test1', // age: '30', // country: 'China', // remark: 'hello' }, // { id: '2', // name: 'test2', // age: '20', // country: 'America', // remark: 'world' }, // { id: '3', // name: 'test3', // age: '18', // country: 'Unkonw', // remark: '"htmlcode">// workbook { SheetNames: ['mySheet'], Sheets: { 'mySheet': { '!ref': 'A1:E4', // 必须要有这个范围才能输出,否则导出的 excel 会是一个空表 A1: { v: 'id' }, ... } } }var _headers = ['id', 'name', 'age', 'country', 'remark'] var _data = [ { id: '1', name: 'test1', age: '30', country: 'China', remark: 'hello' }, { id: '2', name: 'test2', age: '20', country: 'America', remark: 'world' }, { id: '3', name: 'test3', age: '18', country: 'Unkonw', remark: '"color: #ff0000">总结以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
出处
http://scarletsky.github.io/2016/01/30/nodejs-process-excel/
参考资料
https://github.com/SheetJS/js-xlsx
http://stackoverflow.com/questions/30859901/parse-xlsx-with-node-and-create-json
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新动态
- 雨林唱片《赏》新曲+精选集SACD版[ISO][2.3G]
- 罗大佑与OK男女合唱团.1995-再会吧!素兰【音乐工厂】【WAV+CUE】
- 草蜢.1993-宝贝对不起(国)【宝丽金】【WAV+CUE】
- 杨培安.2009-抒·情(EP)【擎天娱乐】【WAV+CUE】
- 周慧敏《EndlessDream》[WAV+CUE]
- 彭芳《纯色角3》2007[WAV+CUE]
- 江志丰2008-今生为你[豪记][WAV+CUE]
- 罗大佑1994《恋曲2000》音乐工厂[WAV+CUE][1G]
- 群星《一首歌一个故事》赵英俊某些作品重唱企划[FLAC分轨][1G]
- 群星《网易云英文歌曲播放量TOP100》[MP3][1G]
- 方大同.2024-梦想家TheDreamer【赋音乐】【FLAC分轨】
- 李慧珍.2007-爱死了【华谊兄弟】【WAV+CUE】
- 王大文.2019-国际太空站【环球】【FLAC分轨】
- 群星《2022超好听的十倍音质网络歌曲(163)》U盘音乐[WAV分轨][1.1G]
- 童丽《啼笑姻缘》头版限量编号24K金碟[低速原抓WAV+CUE][1.1G]