问题描述
我正在从 Excel 文件中读取数据,假设我在 Java testNG 中有 5 行和 15 列。
查看下面的代码
Class ReadExcel {
public String[][] getCellData(String path,String sheetName) throws InvalidFormatException,IOException {
FileInputStream stream = new FileInputStream(path);
XSSFWorkbook workbook = new XSSFWorkbook(stream);
Sheet s = workbook.getSheet(sheetName);
int rowcount = s.getLastRowNum();
int cellcount = s.getRow(0).getLastCellNum();
String data[][] = new String[rowcount][cellcount];
FormulaEvaluator evaluator= workbook.getCreationHelper().createFormulaEvaluator();
DataFormatter df = new DataFormatter();
for (int i = 1; i <= rowcount; i++) {
Row r = s.getRow(i);
for (int j = 0; j < cellcount; j++) {
Cell c = r.getCell(j);
try {
if(c!=null){
if (c.getCellType() == c.CELL_TYPE_STRING) {
data[i - 1][j] = c.getStringCellValue();
}else if (c.getCellType() == c.CELL_TYPE_FORMULA) {
data[i - 1][j] = df.formatCellValue(c,evaluator);
}
else if (c.getCellType() == c.CELL_TYPE_BOOLEAN) {
data[i - 1][j] = df.formatCellValue(c,evaluator);
}
else{
data[i - 1][j] = String.valueOf(c.getNumericCellValue());
}
}
} catch (Exception e) {
e.printstacktrace();
}
}
}
return data;
}
}
另一个处理数据的类
public class Sample
{
ReadExcel read = new ReadExcel();
@DataProvider (parallel= true)
public String[][] getFilterValues() throws InvalidFormatException,IOException,InterruptedException{
return read.getCellData("fileLoc","fileName");
}
@Test(dataProvider = "getFilterValues")
public void verifyReports(String row,String name,String age,String lastname and so on...) throws Exception
{
System.out.println(FileName);
}
所以,在这里我需要减少 verifyReports 方法中的参数数量,并且应该能够在同一方法中检索整个记录。
注意:未来可能会更改参数计数。
所以我尝试了 Map 概念,但我找不到。
主要目标是减少数量。 verifyReports 方法中的参数。如何实现这一目标。
我是通过使用下面的代码实现的。但它会在 2D 数组中以便在 testNG DataProviders 中使用它
以下是代码,我尝试使用地图列表。
public ArrayList<String> readHeader(String path,String sheetName) throws IOException
{
FileInputStream stream = new FileInputStream(path);
XSSFWorkbook workbook = new XSSFWorkbook(stream);
Sheet s = workbook.getSheet(sheetName);
int rowcount = s.getLastRowNum();
int cellcount = s.getRow(0).getLastCellNum();
ArrayList<String> al = new ArrayList<String>();
Row r = s.getRow(0);
for(int i=0;i<cellcount;i++)
{
Cell c = r.getCell(i);
al.add(c.getStringCellValue());
}
return al;
}
public ArrayList<HashMap<String,String>> getCellData(String path,IOException {
//ExcelConfig ec = new ExcelConfig();
FileInputStream stream = new FileInputStream(path);
ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String,String>>();
XSSFWorkbook workbook = new XSSFWorkbook(stream);
Sheet s = workbook.getSheet(sheetName);
int rowcount = s.getLastRowNum();
int cellcount = s.getRow(0).getLastCellNum();
FormulaEvaluator evaluator= workbook.getCreationHelper().createFormulaEvaluator();
DataFormatter df = new DataFormatter();
ArrayList<String> head = ec.readHeader(path,sheetName);
for (int i = 1; i <= rowcount; i++) {
HashMap<String,String> map = new HashMap<String,String>();
Row r = s.getRow(i);
for (int j = 0; j < cellcount; j++) {
Cell c = r.getCell(j);
try {
if(c!=null){
if (c.getCellType() == c.CELL_TYPE_STRING) {
map.put(head.get(j),c.getStringCellValue());
}else if (c.getCellType() == c.CELL_TYPE_FORMULA) {
map.put(head.get(j),df.formatCellValue(c,evaluator));
}
else if (c.getCellType() == c.CELL_TYPE_BOOLEAN) {
map.put(head.get(j),evaluator));
}
else{
map.put(head.get(j),String.valueOf(c.getNumericCellValue()));
}
}
} catch (Exception e) {
e.printstacktrace();
}
}
list.add(map);
}
return list;
}
public void multiRec() throws InvalidFormatException,IOException
{
ArrayList<HashMap<String,String>> map = read.getCellData(fileLoc,"ComparisonStatus");
for(HashMap<String,String> ls : map)
{
System.out.println(ls.get("Row"));
System.out.println(ls.get("FileName"));
}
}
这里,Row 和 FileName 是 Excel 文件头。所以现在我减少了。论据。但是如何将其转换为二维数组将是现在的任务。
解决方法
最好的方法是创建一个 class
包含所有参数作为类的字段。让类名是CellData
class CellData {
private String row;
private String name;
// and all other relevant fields..
}
在 getCellData
方法中,使用每行的相关值创建并初始化 CellData
的对象,而不是返回 String[][]
返回 CellData[]
。然后进行以下更改:
@DataProvider (parallel= true)
public Object[][] getFilterValues() throws InvalidFormatException,IOException,InterruptedException{
CellData[] cellData = read.getCellData("fileLoc","fileName");
Object[][] data = new Object[cellData.length][];
for(int i = 0; i < cellData.length; i++) {
data[i][0] = cellData[i];
}
return data;
}
@Test(dataProvider = "getFilterValues")
public void verifyReports(CellData data) throws Exception
{
// test code.
}
既然您说将来可能会引入新的参数,那么使用类将非常有益,因为它可以帮助代码保持可维护性和可读性。由于无需更新 DataProvider
方法或测试方法,因此未来的任何更新也需要更少的代码更改。唯一的变化是 CellData
类中的新字段并在 getCellData
方法中设置新字段的值。