用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 阅读(144) 评论(1) 编辑 收藏 举报