根据一列读取excel数据并将其提供给java类

时间:2015-11-27 07:26:16

标签: java excel apache-poi testng

我目前正从excel表中提取数据并使用testNG的dataProvider注释传递给我的测试。我从excel返回数据的代码如下。

public static Object [][] excelData(String filepath) throws Exception {
   File excelFilePath = new File (filepath);
   FileInputStream fis = new FileInputStream(excelFilePath);

   HSSFWorkbook wb = new HSSFWorkbook(fis);
   HSSFSheet ws = wb.getSheet("Data");

   int rowNum = ws.getLastRowNum()+1;
   int colNum = ws.getRow(0).getLastCellNum();
   Object[][] data = new Object[rowNum][colNum];

   for (int i=0; i<rowNum; i++){
     HSSFRow row = ws.getRow(i);
     for (int j=0; j<colNum; j++){
        HSSFCell cell = row.getCell(j);
        Object value =(Object) cellToString(cell);
        data[i][j] = (Object)value;
      //  System.out.println("The value is " + value);

     }
   }

   System.out.println(Arrays.deepToString(data));

   return data;
}

public static Object cellToString(HSSFCell cell){
   int type;
   Object result;
   type = cell.getCellType();

   switch(type) {
    case 0://numeric value in excel
        result = cell.getNumericCellValue();
        break;
    case 1: //string value in excel
        result = cell.getStringCellValue();
        break;
    case 2: //boolean value in excel
        result = cell.getBooleanCellValue ();
        break;
    default:
        throw new RuntimeException("There are not support for type with id ["+type+"] of cell");
   }

   return result;
 }

目前的excel看起来如下

actual Excel

我需要根据最后一栏传递用户名和密码,如下所示

expected excel

1 个答案:

答案 0 :(得分:0)

您的代码目前正在读取所有单元格。

在excel文件中,可能有不同大小的列。如果只获得第一行的大小,则会丢失行的某些单元格值(大于第一行coulmn大小)。 而不是int colNum = ws.getRow(0).getLastCellNum();,您应该编写自己的方法来查找最大的列大小,如下所示。请调用此方法int colNum = getMaxColumnNum(ws);

public static int getMaxColumnNum(HSSFSheet ws) {
    int rowNum = ws.getLastRowNum() + 1;
    int max = 0;
    int temp = 0;
    for (int i = 0; i < rowNum; i++) {
        temp = ws.getRow(i).getLastCellNum();
        if (max < temp)
            max = temp;
    }
    return max;
}

此外,您的方法名称为cellToString(),但它返回了Object,您应该使用getCellValue()更改其名称。