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

Selenium中使用for循环读取Excel数据时出现错误求助

问题分析与修复方案

我来帮你排查下这段读取Excel的代码里可能导致错误的几个关键点,以及对应的修复方案:

常见错误点梳理

  • 资源关闭时机错误:你原本的代码里把fis.close()放在循环内部?这会导致第一次循环就关闭了文件输入流,后续循环再操作Workbook时必然报错。而且手动关闭资源容易遗漏,最好用Java的try-with-resources语法自动管理。
  • 单元格类型不匹配异常:直接调用getStringCellValue()或getNumericCellValue()很容易踩坑——如果单元格实际是数字类型却调用字符串方法,或者反过来,都会抛出IllegalStateException。
  • 空单元格/空行的空指针问题:如果Excel里某一行的某个单元格是空的,getCell()会返回null,直接调用后续方法会触发空指针异常。

修正后的完整代码

@Test
public void passTest() throws IOException {
    // 用try-with-resources自动管理文件输入流,无需手动close
    try (FileInputStream fis = new FileInputStream("F:\\drive f\\DemoReport.xlsx");
         XSSFWorkbook wb = new XSSFWorkbook(fis)) {
        
        XSSFSheet sheet1 = wb.getSheetAt(0);
        // getLastRowNum返回最后一行的索引(从0开始),循环条件没问题
        int rowcount = sheet1.getLastRowNum();
        
        for (int i = 1; i <= rowcount; i++) {
            XSSFRow row = sheet1.getRow(i);
            // 先判断行是否为空(比如中间有空行)
            if (row == null) {
                continue;
            }
            
            // 处理单元格:先获取单元格,再判断类型,避免类型不匹配
            String str = getCellValueAsString(row.getCell(2));
            String str1 = getCellValueAsString(row.getCell(1));
            // 处理数字单元格,先判断类型再转换
            Double j = getCellValueAsDouble(row.getCell(3));
            
            // 这里可以添加你的Selenium操作逻辑,比如使用str、str1、j这些数据
            System.out.println("读取到数据:" + str1 + ", " + str + ", " + j);
        }
    }
}

// 工具方法:将单元格内容转为字符串,兼容各种类型
private String getCellValueAsString(XSSFCell cell) {
    if (cell == null) {
        return "";
    }
    switch (cell.getCellType()) {
        case STRING:
            return cell.getStringCellValue();
        case NUMERIC:
            // 如果是数字类型,转为字符串(比如整数或小数)
            return String.valueOf(cell.getNumericCellValue());
        case BOOLEAN:
            return String.valueOf(cell.getBooleanCellValue());
        case FORMULA:
            return cell.getCellFormula();
        default:
            return "";
    }
}

// 工具方法:将单元格内容转为Double,只处理数字类型
private Double getCellValueAsDouble(XSSFCell cell) {
    if (cell == null || cell.getCellType() != CellType.NUMERIC) {
        return null; // 或者根据你的需求返回默认值,比如0.0
    }
    return cell.getNumericCellValue();
}

关键改进说明

  1. 自动资源管理:用try-with-resources包裹FileInputStream和XSSFWorkbook,JVM会自动在代码块结束后关闭资源,避免泄漏。
  2. 单元格类型兼容:通过工具方法统一处理不同类型的单元格,避免直接调用类型方法导致的异常。
  3. 空值防护:先判断行和单元格是否为null,跳过空行或空单元格,避免空指针。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:41:29