Cypress测试遍历XLSX文件报Cannot read properties of undefined如何解决
报错解决方案
核心错误原因
- 变量名重复覆盖:循环内用
var jsonData = jsonData[index].data直接覆盖了外层parseXlsx返回的原始解析结果,第二次循环时访问的已经是被覆盖后的行数据数组,不存在data属性,直接触发undefined报错。 - 数据结构认知偏差:
node-xlsx解析xlsx后返回的结构为工作表数组,格式如下:
[ { name: '工作表1名称', data: [ // 工作表内所有行数据,是二维数组 ['USERNAME', 'PASSWORD'], // 第一行表头 ['Username1', 'Password1'], // 第二行数据 ['Username2', 'Password2'] // 第三行数据 ] } ]
行数据本身是普通数组,没有data属性,你之前的调用逻辑完全不符合数据结构。
- 循环逻辑错误:每次循环都调用
cy.writeFile会持续覆盖文件内容,且每次都固定取第一行的值,最终输出结果不符合预期。
修改后的spec.js代码
describe('convert data to Json', () => { it('read data from excel', () => { cy.parseXlsx('cypress/fixtures/excelData.xlsx').then((excelParseResult) => { // 取第一个工作表的行数据 const sheetRows = excelParseResult[0].data const userList = [] // 跳过表头,从第二行(index=1)开始遍历 for (let index = 1; index < sheetRows.length; index++) { const row = sheetRows[index] console.log('当前行数据:', row) // 组装用户数据 userList.push({ username: row[0], password: row[1] }) } // 所有数据组装完成后一次性写入文件 cy.writeFile("cypress/fixtures/xlsxData.json", userList) }) }) })
代码修改说明
- 避免变量名冲突:将外层解析结果变量名改为
excelParseResult,和内部变量完全区分,不会出现覆盖问题。 - 适配数据结构:直接取第一个工作表的
data属性作为行数组遍历,不需要重复访问data属性。 - 优化读写逻辑:先把所有行数据组装成用户数组,最后一次性写入JSON文件,不会出现内容覆盖问题,输出的JSON文件会包含所有行的用户数据。
- 跳过表头处理:遍历从index=1开始,自动忽略第一行的表头内容,不会把USERNAME/PASSWORD作为业务数据写入文件。
内容的提问来源于stack exchange,提问作者user9847788
相关产品推荐
相关产品推荐

