在 Node.js 中使用 js-xlsx 处理 Excel 文件
作者:佚名 来源:小影志 时间:2017-12-30
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 }
来获取单元格,R
和 C
分别代表从 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
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));
- 上一篇:浏览器知道你的哪些信息
- 下一篇:Docker 1.12 配置 direct-lvm
相关阅读
- 常用 JavaScript 库 CDN 加速服务
- 基于 Docker 环境及 Calico 网络的 Consul + Consul Template + Registrator + nginx 容器服务注册和发现
- 搭建 etcd 集群
- Calico 搭建配置
- Docker 1.12 配置 direct-lvm
- JavaScript and CSS Code Beautifier - 代码格式化高亮扩展
- 【译】使用 Intersection Observer 实现图片延迟加载
- 使用 Web Audio API 播放摩斯密码
- 【译】如何创造带方向感应的纯 CSS 悬停效果
- Polyfill.io - 自动化的 JavaScript Polyfill 服务