如何在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
相关产品推荐
相关产品推荐

