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

使用excel4node导出Excel时报Cannot read property 'username'错误如何解决?

问题根因
  • 核心错误是你定义的data是单个对象,并非数组。对象本身没有length属性,遍历条件i <= data.length不生效,且你用数组下标写法data[i]读取对象属性,得到的是undefined,调用undefined.username自然抛出对应报错。
  • 附加错误1:date属性值未用引号包裹,会被JS识别为减法表达式运算,无法得到预期日期值。
  • 附加错误2:数组遍历逻辑不符合下标规则,JS数组默认从0开始索引,你从i=1开始取值会跳过第一条数据。
修复代码

调整后可正常运行的代码如下:

const xl = require('excel4node');
const path = require('path');

const wb = new xl.Workbook();
// 改为数组包裹,单条/多条数据都按数组格式存放
const data = [
  {
    username: 'name',
    department: 'department',
    title: 'title',
    percentage: 23,
    correct: 27,
    // 日期值加引号转为字符串,或直接用new Date包裹
    date: '2021-09-03T16:38:05.107Z'
  }
  // 多条数据直接在数组后追加对象即可
];

const fileName = "Excel.xlsx";
const filePath = path.resolve(__dirname, "../../public/files/", fileName);

const ws = wb.addWorksheet("Sheet 1");

const style = wb.createStyle({
font: {
  color: "FFFFFFFF",
  size: 12,
},
});

// 表头可按需修改为对应字段含义
const form = [
"序号",
"用户名",
"日期",
"部门",
"完成率",
"正确数",
];

for (let i = 0; i < form.length; i++) {
ws.cell(1, i + 1)
  .string(form[i])
  .style(style);
switch(i) {
  case 1:
    ws.column(2).setWidth(30);
    break;
  case 3:
    ws.column(4).setWidth(30);
    break;
  case 4:
    ws.column(5).setWidth(30);
    break;
  case 5:
    ws.column(6).setWidth(30);
    break;
}
}

// 修正遍历逻辑,数组从0开始遍历
for(let i = 0; i < data.length; i++) {
const current = data[i];
ws.cell(i + 2, 1).number(i + 1);
ws.cell(i + 2, 2).string(current.username);
ws.cell(i + 2, 3).date(new Date(current.date));
ws.cell(i + 2, 4).string(current.department);
ws.cell(i + 2, 5).number(current.percentage);
ws.cell(i + 2, 6).number(current.correct);
}
wb.write(filePath);

内容的提问来源于stack exchange,提问作者Adil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:45:04