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

如何在Katalon中获取Excel文件的列名及指定列的值

问题解决:Excel列名获取与指定列值读取

原代码核心问题分析

你当前的代码仅能读取第一个值,主要原因是循环内未切换到下一行,同时存在多处拼写错误与资源处理问题:

  • 未在循环中调用row = sheet.getRow(nextRowIndex)遍历后续行
  • 变量名拼写错误(如FilelnputStream→FileInputStream、XSSFWbrkbook→XSSFWorkbook、rsaValuesList与rsltValuesList变量名不一致)
  • 提前关闭文件输入流fis,导致工作簿读取失败
  • 日期处理逻辑错误,df.getStringCellValue(format(date))应为df.format(date)

修正后的完整实现

以下代码同时实现你需要的两个功能,且修复了原代码的所有问题:

1. 获取所有列名列表

@Keyword
def getColumnNames(String xlFilePath, String sheetName) {
    List<String> columnNames = new ArrayList<>()
    FileInputStream fis = null
    try {
        fis = new FileInputStream(xlFilePath)
        def workbook = new XSSFWorkbook(fis)
        def sheet = workbook.getSheet(sheetName)
        if (!sheet) {
            return "Sheet $sheetName does not exist"
        }
        def headerRow = sheet.getRow(0)
        if (!headerRow) {
            return "No header row found"
        }
        for (int i = 0; i < headerRow.getLastCellNum(); i++) {
            def cell = headerRow.getCell(i)
            columnNames.add(cell != null ? cell.getStringCellValue().trim() : "")
        }
        workbook.close()
    } catch (Exception e) {
        e.printStackTrace()
        return "Error reading Excel: ${e.getMessage()}"
    } finally {
        if (fis != null) fis.close()
    }
    return columnNames
}

2. 根据列名获取指定列的所有值

@Keyword
def getCellValuesList(String xlFilePath, String sheetName, String colName) {
    List<String> valuesList = new ArrayList<>()
    FileInputStream fis = null
    try {
        fis = new FileInputStream(xlFilePath)
        def workbook = new XSSFWorkbook(fis)
        def sheet = workbook.getSheet(sheetName)
        if (!sheet) {
            return "Sheet $sheetName does not exist"
        }
        // 定位目标列索引
        int colIndex = -1
        def headerRow = sheet.getRow(0)
        if (!headerRow) {
            return "No header row found"
        }
        for (int i = 0; i < headerRow.getLastCellNum(); i++) {
            def cell = headerRow.getCell(i)
            if (cell != null && cell.getStringCellValue().trim().equals(colName.trim())) {
                colIndex = i
                break
            }
        }
        if (colIndex == -1) {
            return "Column $colName does not exist"
        }
        // 遍历所有数据行(从第2行开始,索引1)
        int totalRows = sheet.getPhysicalNumberOfRows()
        for (int rowNum = 1; rowNum < totalRows; rowNum++) {
            def row = sheet.getRow(rowNum)
            if (!row) continue // 跳过空行
            
            def cell = row.getCell(colIndex)
            String cellValue = ""
            if (cell != null) {
                switch (cell.getCellTypeEnum()) {
                    case CellType.STRING:
                        cellValue = cell.getStringCellValue().trim()
                        break
                    case CellType.NUMERIC:
                        if (HSSFDateUtil.isCellDateFormatted(cell)) {
                            DateFormat df = new SimpleDateFormat("dd/MM/yy")
                            cellValue = df.format(cell.getDateCellValue())
                        } else {
                            cellValue = String.valueOf(cell.getNumericCellValue())
                            // 移除整数末尾的.0
                            if (cellValue.endsWith(".0")) {
                                cellValue = cellValue.substring(0, cellValue.length() - 2)
                            }
                        }
                        break
                    case CellType.BOOLEAN:
                        cellValue = String.valueOf(cell.getBooleanCellValue())
                        break
                    case CellType.FORMULA:
                        // 处理公式计算结果
                        def evaluator = workbook.getCreationHelper().createFormulaEvaluator()
                        def evalResult = evaluator.evaluate(cell)
                        switch (evalResult.getCellTypeEnum()) {
                            case CellType.STRING:
                                cellValue = evalResult.getStringValue().trim()
                                break
                            case CellType.NUMERIC:
                                cellValue = HSSFDateUtil.isCellDateFormatted(cell) 
                                    ? new SimpleDateFormat("dd/MM/yy").format(evalResult.getDateValue())
                                    : String.valueOf(evalResult.getNumberValue()).replaceAll("\\.0$", "")
                                break
                            case CellType.BOOLEAN:
                                cellValue = String.valueOf(evalResult.getBooleanValue())
                                break
                            default:
                                cellValue = ""
                        }
                        break
                    default:
                        cellValue = ""
                }
            }
            if (!cellValue.isEmpty()) valuesList.add(cellValue)
        }
        workbook.close()
    } catch (Exception e) {
        e.printStackTrace()
        return "Error reading Excel: ${e.getMessage()}"
    } finally {
        if (fis != null) fis.close()
    }
    return valuesList
}

使用示例

// 获取列名列表
def columnList = getColumnNames("test.xlsx", "Sheet1")
WebUI.comment("列名列表:$columnList")

// 获取指定列的值
def valuesList = getCellValuesList("test.xlsx", "Sheet1", "FirstName")
WebUI.comment("FirstName列的值:$valuesList")

关键优化点

  • 使用getPhysicalNumberOfRows()获取实际存在的行数,避免遍历空行
  • 完善公式单元格的计算结果处理
  • 修复数字转字符串时的.0冗余问题
  • 加入空行、空单元格的容错处理
  • 规范资源关闭逻辑,避免IO泄漏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 08:15:29