使用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
相关产品推荐
相关产品推荐

