在ObservableHQ中直接使用exceljs加载Excel文件时工作表访问异常
Observable直接使用exceljs加载Excel后工作表数组为空的解决方法
这个问题的核心是Observable运行时的响应式序列化机制和exceljs的属性实现逻辑冲突:
exceljs的workbook.worksheets属于懒加载的getter属性,不是对象的可枚举自有属性。你在加载Excel的单元格返回完整workbook对象时,Observable会默认对返回值做序列化处理,仅保留可枚举自有属性,懒加载的工作表数据不会被包含在序列化结果里,所以其他单元格访问时只能拿到空数组。你在对象资源管理器能看到数据,是因为资源管理器会触发getter执行拉取懒加载数据,不代表序列化后的对象也保留了该数据。
解决步骤如下:
- 加载完成后不要直接返回完整的exceljs workbook对象,提前主动提取你需要的所有数据,存入普通JS对象后再返回
- 提取数据时显式遍历所有工作表,把需要的表属性、行列数据都提前执行读取操作,避免懒加载属性丢失,示例代码如下:
// 引入exceljs依赖 import ExcelJS from 'exceljs' // 加载Excel文件的单元格代码 const processExcelFile = async (uploadedFile) => { const workbook = new ExcelJS.Workbook() // 传入文件的ArrayBuffer完成加载 await workbook.xlsx.load(uploadedFile.arrayBuffer()) // 主动提取所有需要的属性,返回普通对象 return { sheetNameList: workbook.sheetNames, allWorksheets: workbook.worksheets.map(sheet => ({ sheetName: sheet.name, totalRows: sheet.rowCount, totalColumns: sheet.columnCount, // 显式拉取所有行数据 rowData: sheet.getRows(1, sheet.rowCount)?.map(row => row.values) || [] })) } }
- 其他响应式单元格直接引用上述代码返回的对象,就能正常访问所有工作表数据
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

