zoukankan      html  css  js  c++  java
  • 使用 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 } 来获取单元格,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 < 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-xlsx 和 SheetJS 官网

    转自 https://c7sky.com/parse-spreadsheet-with-js-xlsx-in-node-js.html

  • 相关阅读:
    Linux更新时,出现无法更新锁
    Linux显示su:认证失败
    08 redis的缓存预热,雪崩,击穿,穿透问题以及常用的监控参数
    06 redis的哨兵系统的工作流程
    05 redis的主从复制机制的工作流程以及相关基础知识
    03 redis的事务以及锁、过期数据的删除策略、逐出算法、配置文件的核心配置参数
    02 jedis以及redis的持久化
    01 redis的5种基本数据类型的介绍,使用以及应用场景
    M1 MySQL事务知识点的总结
    02 Java文件读写通道的使用以及文件的基本操作方法
  • 原文地址:https://www.cnblogs.com/unreal-feather/p/12794129.html
Copyright © 2011-2022 走看看