XLSX模块sheet_to_row_object_array方法优先读取w字段值的实现问题
XLSX 模块优先读取格式化值的实现方法
你要实现的需求可以通过调整sheet_to_row_object_array方法的参数直接实现,无需修改模块源码:
- 核心原理:
XLSX.utils.sheet_to_row_object_array是sheet_to_json方法的别名,默认开启raw配置项,会读取单元格原始值v字段,将raw设为false就会优先读取格式化后的w字段值。 - 注意:你原代码中调用方法时直接传入工作表名称是错误的,该方法第一个参数需要传入工作表对象。
正确代码示例:
var XLSX = require("xlsx"); // 读取工作簿逻辑保持不变 var workbook = XLSX.read(data, { type: "array" }); // 调用方法时新增raw: false配置 var excelRows = XLSX.utils.sheet_to_row_object_array(workbook.Sheets["Current positions"], { raw: false }); console.log(excelRows);
修改后输出结果符合你的预期:
'ISSUER SHARE ISIN code': 'BE0974320526', '% OF ISSUED CAPITAL': '0.69%', 'POSITION DATE': '11/11/2021'
如果需要自定义取值优先级(比如部分字段要原始值、部分要格式化值),可以手动遍历单元格实现自定义转换:
function customSheetToRow(sheet) { // 先获取表头和原始行数据 const rawRows = XLSX.utils.sheet_to_row_object_array(sheet, { header: 'A' }); const headerMap = rawRows[0]; const result = []; // 从第二行开始遍历数据行 for (let rowNum = 1; rowNum < rawRows.length; rowNum++) { const currentRow = {}; for (const colKey in rawRows[rowNum]) { const cell = sheet[`${colKey}${rowNum + 1}`]; // 自定义规则:优先取w字段,不存在则取v字段 currentRow[headerMap[colKey]] = cell?.w ?? cell?.v; } result.push(currentRow); } return result; } // 调用自定义方法 var excelRows = customSheetToRow(workbook.Sheets["Current positions"]);
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

