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

如何用Java从Excel获取单行数据并传入TestNG Data Provider

获取Excel指定行数据并传入TestNG Data Provider

需求说明

已有能获取Excel所有行数据的工具类,需修改实现获取指定第n行数据并传入TestNG的Data Provider。

修改后的工具类

新增专门获取单行数据的方法,兼容TestNG Data Provider的返回格式要求:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.IOException;

public class ExcelUtils {
    // 原有的获取所有行数据方法
    public static Object[][] getTestData(String sheetName) {
        Object[][] data = null;
        DataFormatter fmt = new DataFormatter();
        try (Workbook workbook = new XSSFWorkbook(
                new FileInputStream("path"))) {
            Sheet sheet = workbook.getSheet(sheetName);
            data = new Object[sheet.getLastRowNum()][sheet.getRow(0).getLastCellNum()];
            for (int i = 0; i < sheet.getLastRowNum(); i++) {
                for (int k = 0; k < sheet.getRow(0).getLastCellNum(); k++) {
                    data[i][k] = fmt.formatCellValue(sheet.getRow(i + 1).getCell(k));
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return data;
    }

    // 新增:获取指定行数据的方法
    public static Object[][] getSingleRowTestData(String sheetName, int targetRowIndex) {
        Object[][] data = null;
        DataFormatter fmt = new DataFormatter();
        try (Workbook workbook = new XSSFWorkbook(new FileInputStream("path"))) {
            Sheet sheet = workbook.getSheet(sheetName);
            if (sheet == null) {
                throw new IllegalArgumentException("工作表 " + sheetName + " 不存在");
            }

            Row targetRow = sheet.getRow(targetRowIndex);
            if (targetRow == null) {
                throw new IllegalArgumentException("指定行索引 " + targetRowIndex + " 无数据");
            }

            // 以表头行(第0行)的列数为准
            int columnCount = sheet.getRow(0).getLastCellNum();
            // Data Provider要求返回二维数组,单行数据需包装为1行n列的结构
            data = new Object[1][columnCount];

            for (int k = 0; k < columnCount; k++) {
                Cell cell = targetRow.getCell(k);
                data[0][k] = fmt.formatCellValue(cell);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return data;
    }
}

关键说明

  1. 行索引注意:POI中Excel行索引从0开始。若你的Excel第1行是表头,第3行是目标数据行,需传入targetRowIndex = 2;若想直接传入用户看到的行号(比如第3行传3),可将sheet.getRow(targetRowIndex)改为sheet.getRow(targetRowIndex - 1)。
  2. Data Provider格式:必须返回Object[][]类型,因此单行数据要包装成1行多列的二维数组。
  3. 空值处理:增加了工作表和目标行的空判断,避免空指针异常。
  4. 格式统一:用DataFormatter将所有单元格值转为字符串,适配数字、日期等多种单元格类型。

TestNG Data Provider使用示例

import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class ExcelRowTest {

    @DataProvider(name = "thirdRowData")
    public Object[][] provideThirdRowData() {
        // 获取第3行数据(表头为第1行,故索引为2)
        return ExcelUtils.getSingleRowTestData("Sheet1", 2);
    }

    @Test(dataProvider = "thirdRowData")
    public void testWithThirdRow(String col1, String col2, String col3) {
        // 参数个数需与Excel行的列数一致,类型可按需调整
        System.out.println("第一列:" + col1);
        System.out.println("第二列:" + col2);
        System.out.println("第三列:" + col3);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 22:40:57