在 Node.js 中使用 js-xlsx 处理 Excel 文件

SheetJS js-xlsx 是目前关注度最高的处理 Excel 的 JavaScript 库。支持 XLS/XLSX/CSV/ODS 等多种表格格式,功能强大,但文档看起来有点累。本文主要是介绍下 js-xlsx 的基本概念和操作。

基本概念

workbook工作簿worksheet工作表cell单元格A1 标记引用单元格时所使用的地址格式(如:A1、C7)

基本用法

读取文件

import XLSX from 'xlsx';
 
const wb = XLSX.readFile('path/to/file.xlsx'); // 返回 workbook

workbook 对象结构如下:

{
    SheetNames: ['Sheet1', 'Sheet2'],
    Sheets: {
       'Sheet1': { ... },
       'Sheet2': { ... }
    },
    Props: { ... },
    ....
}

获取工作表

根据表名获取对应的工作表

const ws = wb.Sheets[workbook.SheetNames[0]]; // 返回 worksheet

worksheet 对象结构如下:

{
'!ref': 'A1:C7',
A1: { ... },
B1: { ... },
....
}

其中 worksheet['!ref'] 是工作表的有效范围(基于 A-1)。

获取单元格

通过 worksheet[address_of_cell] 获取单元格,也就是通过 A1 标记的键名来获取单元格:

const cell = wb['C7'];

或者通过地址对象 { r: R, c: C } 来获取单元格,RC 分别代表从 0 开始的行和列的索引。

// XLSX.utils 中的 encode_cell/decode_cell 方法可以转换单元格地址
const cell = wb[XLSX.utils.encode_cell({ r: 7, c: 2 })]; // 等同于 wb['C7']

cell 对象结构如下:

{
    v: 'C7SKY',
    w: 'C7SKY',
    t: 's',
    ....
}

编辑单元格

cell.v = '小影志';
delete cell.w;

需要注意的是,内建的导出工具会优先尝试使用 w 的值,所以如果之后要使用导出功能,在修改值时应该同时删除 w 按键或设置为 undefined

删除行/删除列

js-xlsx 并没有提供删除行/删除列的功能,所以需要我们自行实现:

function encodeCell(r, c) {
    return XLSX.utils.encode_cell({ r, c });
}
 
function deleteRow(ws, index) {
    const range = XLSX.utils.decode_range(ws['!ref']);
 
    for (let row = index; row < range.e.r; row++) {
        for (let col = range.s.c; col <= range.e.c; col++) {
            ws[encodeCell(row, col)] = ws[encodeCell(row + 1, col)];
        }
    }
 
    range.e.r--;
 
    ws['!ref'] = XLSX.utils.encode_range(range.s, range.e);
}
 
function deleteCol(ws, index) {
    const range = XLSX.utils.decode_range(ws['!ref']);
 
    for (let col = index; col < range.e.c; col++) {
        for (let row = range.s.r; row <= range.e.r; row++) {
            ws[encodeCell(row, col)] = ws[encodeCell(row, col + 1)];
        }
    }
 
    range.e.c--;
 
    ws['!ref'] = XLSX.utils.encode_range(range.s, range.e);
}

XLSX.utils 中的 encode_range / decode_range 方法用来转换单元格范围(A2:C7 相当于{s:{c:0, r:1}, e:{c:2, r:6}})。

保存/导出

通过 XLSX.writeFile(wb, filename) 就可以生成新的表格文件:

XLSX.writeFile(wb, 'output.xlsx');

XLSX.utils.sheet_to_* 则提供了多种导出格式(csv/txt/html/json/formulae),以下是导出 JSON 文件的代码:

const data = XLSX.utils.sheet_to_json(ws);
 
fs.writeFileSync('path/to/export.json', JSON.stringify(data, null, 4));

最后,附上 js-xlsx 的 GitHub 仓库地址 SheetJS/js-xlsxSheetJS 官网

除特别注明外,本站所有文章均为慕白博客原创,转载请注明出处来自https://geekmubai.com/code/140.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏前端吧啦吧啦

手把手教你全家桶之React(二)

13530
来自专栏从零开始学自动化测试

Selenium2+python自动化24-js处理富文本

前言 上一篇Selenium2+python自动化23-富文本(自动发帖)解决了富文本上iframe问题,其实没什么特别之处,主要是iframe的切换,...

31050
来自专栏王磊的博客

带你玩转七牛云存储——高级篇

75930
来自专栏前端吧啦吧啦

手把手教你全家桶之React(二)

43480
来自专栏非典型技术宅

ViewController及View的生命周期1. 起因2. Controller的生命周期3. View的生命周期4. 内存警告

16330
来自专栏ShaoYL

UINavigationController

38460
来自专栏静默虚空的博客

Eclipse 使用小结

代码智能提示 Java智能提示 Window -> Preferences -> Java -> Editor -> Content Assist -> Aut...

24860
来自专栏Golang语言社区

厚土Go学习笔记 | 34. 一个简单的 web 服务器实现

go 语言实现 web 服务器很容易。这样就可以很任意的建立 web 应用而互不干扰。当然,端口和IP要规划好。不过这里不讨论这个范畴的内容。我们只实现最基本的...

37290
来自专栏DannyHoo的专栏

底牌项目中上传牌谱功能之编辑标准模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/de...

13330
来自专栏玩转JavaEE

SpringBoot中使用POI,快速实现Excel导入导出

本文是vhr系列的第十一篇,vhr项目地址https://github.com/lenve/vhr 导出Excel 整体来说,Excel有.xls和.xls...

98350

扫码关注云+社区

领取腾讯云代金券