• 使用 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

  • 相关阅读:
    leetcode 86. Partition List
    leetcode 303. Range Sum Query
    leetcode 1310. XOR Queries of a Subarray
    leetcode 1309. Decrypt String from Alphabet to Integer Mapping
    leetcode 215. Kth Largest Element in an Array
    将numpy.ndarray写入excel
    leetcode 1021 Remove Outermost Parentheses
    leetcode 1306. Jump Game III
    leetcode 1305. All Elements in Two Binary Search Trees
    ICCV2019 oral:Wavelet Domain Style Transfer for an Effective Perception-distortion Tradeoff in Single Image Super-Resolution
  • 原文地址:https://www.cnblogs.com/unreal-feather/p/12794129.html
Copyright © 2020-2023  润新知