用node读取Excel指定sheet并输出想要的数据结构

数据部门维护了一个Excel表格,前端显示需要其中一个sheet的数据,这个表老是更新,想着用node写一个程序,每次数据部门更新直接跑一遍。直接上代码:

const XLSX = require('xlsx');
const path = require('path');
const fs = require('fs');

// 读取Excel文件
const excelFile = '要读取的Excel文件路径';
const sheetName = '指定sheet的名称';  // 指定读取的表格名称

// 构造Excel文件的绝对路径
const excelFilePath = path.resolve(__dirname, excelFile);

// 读取Excel文件内容
const workbook = XLSX.readFile(excelFilePath);

// 获取指定名称的表格
const worksheet = workbook.Sheets[sheetName];

// 在使用 xlsx 库读取 Excel 文件时,每个单元格的数据被存储在 worksheet 对象的属性中,属性名是单元格的坐标(例如 'A1'、'B2' 等)。这些属性的值是包含单元格数据的对象,而不是直接的数据值。
// 这样设计的目的是为了提供更多的灵活性和功能,使得可以轻松地访问单元格的内容、样式、公式等信息。每个单元格的数据对象中通常包含以下属性:
// v:单元格的值(value)。
// t:单元格的类型(type),可能是 's'(字符串)、'n'(数字)、'b'(布尔值)等。
// r:原始值(raw value)。
// h:HTML 格式的值(HTML value)。
// w:显示值(display value)。
// 因此,当你访问 worksheet 对象的属性时,实际上获取到的是一个包含单元格数据的对象,而不是直接的数据值。为了方便获取数据值,你需要从单元格数据对象中提取出对应的值属性(通常是 v 属性)。
// 如果你希望直接获取单元格的数据值而不是包含数据的对象,可以使用 v 属性来访问。
// 所以这里需要先获取表格的有数据的行数
const dataRange = worksheet['!ref'];

// 解析范围字符串,获取数据的起始行和结束行
const [startCell, endCell] = dataRange.split(':');
const startRow = parseInt(startCell.match(/\d+/)[0], 10);
const endRow = parseInt(endCell.match(/\d+/)[0], 10);

// 计算数据行数
const numRowsWithData = endRow - startRow + 1;

// 读取表格中的指定列数据
const selectedColumns = ['A', 'C', 'E'].map(col => {
    let arr = []
    for (let i = 0; i < numRowsWithData; i++) {
        arr.push(worksheet[col + '' + i] && worksheet[col + '' + i].v ? worksheet[col + '' + i].v : '')
    }
    return arr;
})

// 这里只是读取出来数据并放入数组,在这里还可以进行其他操作,整理成你想要的数据格式。

// 转化成json字符串
// JSON.stringify 第二个参数是可选的 如果该参数是一个函数,则在序列化过程中,被序列化的值的每个属性都会经过该函数的转换和处理;如果该参数是一个数组,则只有包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中;如果该参数为 null 或者未提供,则对象所有的属性都会被序列化。
// 第三个参数指定缩进用的空白字符串,用于美化输出。
const jsonData = JSON.stringify(selectedColumns, null, 2);

// 最后写入 JSON 文件
const outputFile = 'output.json';
fs.writeFileSync(outputFile, jsonData);

搞定。

posted on 2024-04-08 14:32  hanguahannibk  阅读(174)  评论(1编辑  收藏  举报