专栏首页极客慕白的成长之路在 Node.js 中使用 js-xlsx 处理 Excel 文件

在 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 条评论
登录 后参与评论

相关文章

  • Python中使用Xpath

    XPath介绍: 是什么? 全称为XML Path Language 一种小型的查询语言 说道XPath是门语言,不得不说它所具备的优点: 1) 可在XM...

    慕白
  • C++上机考试试题解析

    慕白
  • HTTP协议原理及实践

    HTTP是在应用层,基于传输层 0x1 低三层 物理层主要作用是定义物理设备如何传输数据 数据链路层在通信的实体间建立数据链路连接 网络层为数据在结...

    慕白
  • MRP系统为制造商带来的8大好处

    物料需求计划(MRP)是一种制造管理系统,可帮助制造商处理生产计划,计划和库存控制。MRP也可互换地用于指代制造资源计划,实际上是MRP II。如今,各个行业的...

    深圳ERP
  • Go语言的fmt包中文教程

    Fmt包 import "fmt" 简介 ▾ Package fmt包含有格式化I/O函数,类似于C语言的printf和scanf。格式字符串的规则来源于C但更...

    李海彬
  • Go语言的fmt包中文教程

    Fmt包 import "fmt" 简介 ▾ Package fmt包含有格式化I/O函数,类似于C语言的printf和scanf。格式字符串的规则来源于C但更...

    李海彬
  • 推荐 10 款,程序员,贼好使的,开源工具!

    本文主要介绍Java程序员应该在2020年学习的一些基本和高级工具。如果你是一位经验丰富的Java开发人员,你可能对这些工具很熟悉,但如果不是,现在就是是开始学...

    猿天地
  • 一款新的基于Tor的恶意软件 – ChewBacca

    与金融木马有关的网络犯罪近几个月日益攀升。而基于Tor的木马仍是网络罪犯们的最爱,这种木马能够隐藏他们的肉鸡,还能隐藏他们的指挥与控制(Command ...

    FB客服
  • GoBrut破解型僵尸网络悄然再度来袭

    Go语言因为跨平台且易上手,越来越受到攻击者的青睐。2019年年初[1],一个由Go语言编写的新型恶意软件家族问世,称为GoBrut(又名StealthWork...

    绿盟科技研究通讯
  • Java程序员必备的开源工具

    Java世界中存在许多工具,从Eclipse,NetBeans和IntelliJ IDEA等著名的IDE开始到Java开发人员应该知道的JVM分析和监视工具,如...

    Rookie

扫码关注云+社区

领取腾讯云代金券