如何用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; } }
关键说明
- 行索引注意:POI中Excel行索引从0开始。若你的Excel第1行是表头,第3行是目标数据行,需传入
targetRowIndex = 2;若想直接传入用户看到的行号(比如第3行传3),可将sheet.getRow(targetRowIndex)改为sheet.getRow(targetRowIndex - 1)。 - Data Provider格式:必须返回
Object[][]类型,因此单行数据要包装成1行多列的二维数组。 - 空值处理:增加了工作表和目标行的空判断,避免空指针异常。
- 格式统一:用
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
相关产品推荐
相关产品推荐

