使用exceljs读取Excel列值无法存入数组问题求助
问题分析与解决方法
嘿,我来帮你搞定这个问题~你的代码里有两个关键错误导致array_is输出为空,咱们一步步拆解:
1. 异步操作的执行顺序搞反了
workbook.xlsx.readFile()是异步Promise操作,它不会阻塞后续代码的执行。你写的console.log(array_is)在异步回调(then里面的逻辑)执行之前就跑了,这时候array_is还没被填充,自然是空数组。
简单说:文件还没读完,你就急着打印数组了,当然看不到内容。
2. push方法的使用错误
array.push()方法的返回值是添加元素后数组的新长度,不是数组本身。你写的array_is = array_is.push(col.values)相当于把数组变成了一个数字(比如数组长度),这完全不是你想要的效果。
修正后的代码方案
方案一:用async/await让代码更直观(推荐)
这种写法能把异步代码变成同步风格,避免回调嵌套,逻辑更清晰:
const excel = require('exceljs'); async function extractExcelColumn() { let array_is = []; const workbook = new excel.Workbook(); // 等待文件读取完成 await workbook.xlsx.readFile("path_to_file"); const worksheet = workbook.getWorksheet('Sheet1'); const col = worksheet.getColumn(1); // 把列值赋值给数组(如果col.values第一个元素是undefined,可过滤掉:col.values.filter(val => val !== undefined)) array_is = [...col.values]; // 或者用push添加所有元素:array_is.push(...col.values); console.log(array_is); // 这时候数组已经填充完成 } // 调用函数 extractExcelColumn();
方案二:在then回调内完成所有操作
如果不想用async/await,就把所有依赖异步结果的逻辑都放进then里面:
const excel = require('exceljs'); let array_is = []; const workbook = new excel.Workbook(); workbook.xlsx.readFile("path_to_file") .then(() => { const worksheet = workbook.getWorksheet('Sheet1'); const col = worksheet.getColumn(1); console.log(col.values); // 正确添加元素到数组 array_is.push(...col.values); // 或者直接赋值:array_is = col.values; console.log(array_is); // 这里打印才会有内容 }); // 不要在这里打印array_is!异步操作还没完成
另外补充:getColumn(1)返回的col.values数组,第一个元素可能是undefined(exceljs的设计,对应Excel的行号占位),如果不需要这个值,可以用col.values.filter(val => val !== undefined)过滤掉。
内容的提问来源于stack exchange,提问作者demouser123
相关产品推荐
相关产品推荐

