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

无法在JMeter 3.1中通过Groovy运行可在Eclipse执行的Java读Excel代码

解决JMeter 3.1中Groovy脚本读取Excel的编译错误

嘿,我帮你分析下为啥这段代码在Eclipse能正常跑,放到JMeter的JSR223 Sampler里用Groovy执行就报编译错误了——核心原因是Groovy脚本在JMeter环境下的运行逻辑和Java独立程序不一样,还有几个细节没适配到位,咱们一步步来修复:

问题根源拆解

首先看你遇到的MultipleCompilationErrorsException,主要来自这几个点:

  • 不需要main方法:JMeter的JSR223脚本是直接执行代码逻辑的,不是像Java程序那样通过main方法启动,这个多余的入口方法会直接导致编译失败。
  • 路径转义坑:Windows路径里的\在Groovy字符串中是转义字符,你直接写C:\Users\...会被Groovy解析成无效的转义序列,必须改成\\或者用正斜杠/。
  • 缺少类导入:Groovy在JMeter中不会自动导入Apache POI的相关类,你得手动把用到的包都导入进来,不然Groovy找不到这些类。
  • 日志输出方式:虽然System.out.println不是编译错误,但在JMeter里用这个输出的内容会跑到控制台日志里,不如用JMeter自带的log对象更方便调试。

修改后的可运行Groovy脚本

// 先导入所有需要用到的类
import org.apache.poi.xssf.usermodel.XSSFWorkbook
import org.apache.poi.xssf.usermodel.XSSFSheet
import org.apache.poi.ss.usermodel.Row
import org.apache.poi.ss.usermodel.Cell
import org.apache.poi.ss.usermodel.DataFormatter
import java.io.File
import java.io.FileInputStream
import java.util.ArrayList
import java.util.Locale

// 替换成你的Excel路径,注意用双斜杠转义或者正斜杠
def excelFilePath = "C:\\Users\\val1\\Desktop\\Book1.xlsx"
def targetColumn = "PhysicalIDs"
Integer targetColumnIndex = null

// 读取Excel文件
File excelFile = new File(excelFilePath)
FileInputStream fis = new FileInputStream(excelFile)
XSSFWorkbook workbook = new XSSFWorkbook(fis)
XSSFSheet sheet = workbook.getSheetAt(0) // 取第一个工作表

// 遍历第一行,找到目标列的索引
Row headerRow = sheet.getRow(0)
for(Cell cell : headerRow) {
    if (cell.getStringCellValue().equals(targetColumn)) {
        targetColumnIndex = cell.getColumnIndex()
        break // 找到就跳出循环,不用继续遍历了
    }
}

// 处理目标列的数据
if (targetColumnIndex != null) {
    log.info("成功找到目标列,索引为:${targetColumnIndex}")
    DataFormatter formatter = new DataFormatter(Locale.US) // 统一格式化单元格值
    
    for (Row row : sheet) {
        Cell cell = row.getCell(targetColumnIndex)
        if (cell != null) {
            String cellValue = formatter.formatCellValue(cell)
            log.info("第${row.rowNum}行的单元格值:${cellValue}")
            // 如果需要把值存到JMeter变量里,用下面这行
            // vars.put("excel_value_${row.rowNum}", cellValue)
        } else {
            log.info("第${row.rowNum}行的目标列没有内容")
        }
    }
} else {
    log.error("在Excel的第一行里没找到名为${targetColumn}的列!")
}

// 记得关闭资源,避免内存泄漏
fis.close()
workbook.close()

关键修改说明

  1. 删掉main方法:直接写业务逻辑,JMeter会自动执行脚本里的代码。
  2. 修复路径转义:把路径里的\改成\\,或者换成正斜杠C:/Users/val1/Desktop/Book1.xlsx,两种写法都能正常识别。
  3. 添加类导入:开头的import语句把所有用到的POI类和Java工具类都导入了,确保Groovy能找到这些类。
  4. 改用JMeter日志:用log.info()和log.error()代替System.out.println(),日志会输出到JMeter的jmeter.log文件里,在JMeter的“日志查看器”里就能直接看,比控制台方便多了。
  5. 关闭资源:最后加上了流和工作簿的关闭操作,避免长时间运行导致资源泄漏。
  6. 优化循环:找到目标列后加了break,减少不必要的遍历,提升脚本效率。

额外要注意的点

  • POI依赖检查:确保JMeter的lib目录下有这些POI相关的jar包:poi.jar、poi-ooxml.jar、poi-ooxml-schemas.jar、xmlbeans.jar。JMeter 3.1默认应该带了,但如果缺失的话,你得手动把这些jar包放到lib目录里,然后重启JMeter。
  • Groovy版本兼容:JMeter 3.1自带的Groovy版本是2.4.x,尽量别用太新的Groovy语法,比如Java 8+的一些特性,避免兼容性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 13:13:09