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

Katalon中Excel读取列表无法调用toLowerCase()问题求助

问题:从Excel读取的列表调用toLowerCase()失败,报MissingMethodException

问题背景

使用Katalon(主语言Groovy,部分Java)实现以下操作:

  • 读取Excel文件某列的值,存储为String类型列表
  • 将列表内容转为小写

遇到异常情况:

  • 从Excel获取列表的操作看似正常,打印内容正确
  • 普通String列表转小写操作正常
  • 仅从Excel获取的列表调用toLowerCase()时失败,报错提示org.apache.poi.xssf.usermodel.XSSFCell没有toLowerCase()方法

测试用例主脚本

import static com.kms.katalon.core.checkpoint.CheckpointFactory.findCheckpoint
import static com.kms.katalon.core.testcase.TestCaseFactory.findTestCase
import static com.kms.katalon.core.testdata.TestDataFactory.findTestData
import static com.kms.katalon.core.testobject.ObjectRepository.findTestObject
import static com.kms.katalon.core.testobject.ObjectRepository.findWindowsObject
import com.kms.katalon.core.checkpoint.Checkpoint as Checkpoint
import com.kms.katalon.core.cucumber.keyword.CucumberBuiltinKeywords as CucumberKW
import com.kms.katalon.core.mobile.keyword.MobileBuiltInKeywords as Mobile
import com.kms.katalon.core.model.FailureHandling as FailureHandling
import com.kms.katalon.core.testcase.TestCase as TestCase
import com.kms.katalon.core.testdata.TestData as TestData
import com.kms.katalon.core.testng.keyword.TestNGBuiltinKeywords as TestNGKW
import com.kms.katalon.core.testobject.TestObject as TestObject
import com.kms.katalon.core.webservice.keyword.WSBuiltInKeywords as WS
import com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords as WebUI
import com.kms.katalon.core.windows.keyword.WindowsBuiltinKeywords as Windows
import internal.GlobalVariable as GlobalVariable
import org.openqa.selenium.Keys as Keys
import static java.util.stream.Collectors.*
import java.lang.String as String

List<String> lst_ListFromExcel = new ArrayList()

//this works fine
lst_ListFromExcel = CustomKeywords.'com.utils.ExcelFiles.getCellValuesList'(xlFilePath, 0, 3)

//list printed correctly
WebUI.comment("lst_ListFromExcel = $lst_ListFromExcel")

//Copying list I got from excel to a new one. The first time it worked
List<String> resultsList = new ArrayList<String>(lst_ListFromExcel)

WebUI.comment("resultsList = $resultsList")

//Here is where I got the error. However, with any other list it works fine.
resultsList = resultsList.collect{it.toLowerCase()}

WebUI.comment("resultsList = $resultsList")

自定义关键字(读取Excel列值)

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.DateFormat
import java.text.SimpleDateFormat
import org.apache.poi.ss.usermodel.Cell
import org.apache.poi.ss.usermodel.Row
import org.apache.poi.ss.usermodel.Sheet
import org.apache.poi.ss.usermodel.Workbook
import org.apache.poi.ss.usermodel.WorkbookFactory
import org.apache.poi.xssf.usermodel.XSSFWorkbook

// xlFilePath in this format C:\folder\folder\file.xlsx
@Keyword
def getCellValuesList(String xlFilePath, int sheetIndex, int columnIndex) {
    List<String> rsltValuesList = new ArrayList<>()
    def count = 0
    int column_index_1 = 0;
    File file = new File(xlFilePath);
    Workbook workbook = WorkbookFactory.create(new FileInputStream(file));
    Sheet sheet = workbook.getSheetAt(sheetIndex);
    column_index_1 = columnIndex
    Row row = sheet.getRow(0);
    for (Row r: sheet) {
        if (r.getRowNum() == 0) continue; //hearders
        Cell c_1 = r.getCell(column_index_1);
        if (c_1 != null && c_1.getCellType() != Cell.CELL_TYPE_BLANK) {
            System.out.print("  " + c_1 + "\n");
            rsltValuesList.add(c_1)
            count++
        }
    }
    WebUI.comment("Values count = $count")
    WebUI.comment("rsltValuesList = $rsltValuesList")
    return rsltValuesList
}

错误信息

10-09-2022 08:33:27 PM resultsList = resultsList.collect({ -> ... })

Elapsed time: 0.058s

Test Cases/Temp/Temp-ToLowerCase FAILED.
Reason:
groovy.lang.MissingMethodException: No signature of method: org.apache.poi.xssf.usermodel.XSSFCell.toLowerCase() is applicable for argument types: () values: []
    at Script1665186880146$_run_closure1.doCall(Script1665186880146.groovy:32)

解决方案

问题根源

自定义关键字中直接将Cell对象加入了列表,而非将单元格值转换为String类型。虽然打印时Cell对象会自动调用toString()显示内容,但列表实际存储的是XSSFCell实例,不是String,因此调用toLowerCase()会触发方法不存在的异常。

修复代码

修改自定义关键字中的rsltValuesList.add(c_1),将单元格值转为String后再加入列表。可根据单元格类型做针对性处理,避免格式问题:

// 替换原有的rsltValuesList.add(c_1)
String cellValue;
switch(c_1.getCellType()) {
    case Cell.CELL_TYPE_STRING:
        cellValue = c_1.getStringCellValue();
        break;
    case Cell.CELL_TYPE_NUMERIC:
        // 若需处理日期,可添加日期判断逻辑
        cellValue = String.valueOf(c_1.getNumericCellValue());
        break;
    case Cell.CELL_TYPE_BOOLEAN:
        cellValue = String.valueOf(c_1.getBooleanCellValue());
        break;
    default:
        cellValue = c_1.toString();
}
rsltValuesList.add(cellValue);

如果不需要区分单元格类型,接受默认toString()结果,也可简化为:

rsltValuesList.add(c_1.toString())

修复后,列表中存储的是真正的String对象,后续调用collect{it.toLowerCase()}即可正常执行。

内容的提问来源于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.17 03:40:39