You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:22:21