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

读取Excel数据时Null值赋值问题与测试执行报错排查

Excel数据驱动测试读取异常问题排查与修复

问题场景

  • 当Excel表格含表头共5行(4行数据)时,测试可执行,但第4行数据被识别为Null;
  • 当Excel表格含表头共2行(1行数据)时,触发报错:testOnboardProvider (null, null, null, null, null, null), java.lang.IllegalArgumentException: Keys to send should be a not null CharSequence

问题根源分析

你的ReadExcel类中readExcel方法存在3个核心错误:

  1. 循环边界错误:for (int i = 1; i < rows; i++)中,rows是getLastRowNum()返回的索引(从0开始计数)。当表格有5行(表头+4数据行)时,rows=4,循环仅执行到i=3,第4行数据(索引3)完全没被读取;当表格只有2行(表头+1数据行)时,rows=1,循环条件不成立直接跳过,返回的二维数组全为默认null值,导致测试方法接收空参数触发报错。
  2. 列数获取逻辑错误:int cells = wSheet.getRow(rows).getLastCellNum()拿最后一行的列数,若最后一行数据列数少于表头,会导致列数统计偏差,应该从表头行(索引0)获取列数更合理。
  3. 未处理空单元格/行:直接调用getStringCellValue()遇到空单元格会返回null或抛异常,且未处理空行场景。

修复后的代码

public class OnboardProvider extends ProjectSpecificMethods {
    @Test(dataProvider = "sendData")
    public void testOnboardProvider(String ProviderName, String Email, String contactperson, String phno, String address, String pincode) throws InterruptedException {

        new LoginPage()
                .enterUsername("manojgumma221@gmail.com")
                .enterPassword("9491233055")
                .clickLogin()
                .clickUserManagement()
                .clickProviderUser()
                .clickOnAddNewProvider()
                .enterName(ProviderName)
                .enterEmail(Email)
                .enterContactPerson(contactperson)
                .enterContactNumber(phno)
                .enterAddress(address)
                .selectCountry()
                .selectState()
                .SelectCity()
                .enterZipCode(pincode)
                .clickOnboard()
                .verifyProverName();

        Thread.sleep(5000);

    }

    public class ReadExcel {

        public String[][] readExcel() throws IOException {
            XSSFWorkbook wBWorkbook = new XSSFWorkbook("./Data/auto.xlsx");
            XSSFSheet wSheet = wBWorkbook.getSheet("Sheet1");
            
            // 处理Sheet不存在的情况
            if(wSheet == null){
                wBWorkbook.close();
                return new String[0][0];
            }
            
            int totalRows = wSheet.getLastRowNum() + 1; // 总行数(含表头)
            int totalDataRows = totalRows - 1; // 数据行数(去掉表头)
            
            // 无数据行直接返回空数组
            if(totalDataRows <=0){
                wBWorkbook.close();
                return new String[0][0];
            }
            
            // 从表头行获取列数
            int cells = wSheet.getRow(0).getLastCellNum();
            String[][] data = new String[totalDataRows][cells];

            // 遍历所有数据行(从索引1开始到最后一行)
            for (int i = 1; i < totalRows; i++) {
                XSSFRow row = wSheet.getRow(i);
                if(row == null){
                    // 空行填充空字符串
                    for(int j=0;j<cells;j++){
                        data[i-1][j] = "";
                    }
                    continue;
                }
                for (int j = 0; j < cells; j++) {
                    XSSFCell cell = row.getCell(j);
                    String value = "";
                    if(cell != null){
                        // 处理不同单元格类型,统一转为字符串
                        switch (cell.getCellType()) {
                            case STRING:
                                value = cell.getStringCellValue();
                                break;
                            case NUMERIC:
                                value = String.valueOf(cell.getNumericCellValue());
                                // 整数类型去掉小数点后多余的0
                                if(value.endsWith(".0")){
                                    value = value.substring(0, value.indexOf("."));
                                }
                                break;
                            case BOOLEAN:
                                value = String.valueOf(cell.getBooleanCellValue());
                                break;
                            default:
                                value = "";
                        }
                    }
                    data[i - 1][j] = value;
                    System.out.println(value);
                }
            }
            wBWorkbook.close();
            return data;

        }

    }
}

关键修复说明

  1. 修正循环范围:用totalRows = wSheet.getLastRowNum() + 1获取真实总行数,循环覆盖所有数据行,避免遗漏;
  2. 列数从表头获取:保证列数统计准确,不受数据行列数不一致影响;
  3. 空行/空单元格处理:为空行和空单元格填充空字符串,同时支持数值、布尔等不同单元格类型转字符串,避免类型异常;
  4. 增加异常防护:处理Sheet不存在、无数据行的边缘场景,避免空指针异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 13:50:23