Selenium — чтение из Excel с использованием Apache POI дает исключение в потоке «main» java.lang.IllegalArgumentException: индекс ячейки должен быть> = 0

#java #selenium #selenium-webdriver

#java #селен #selenium-webdriver

Вопрос:

Я написал простую утилиту Excel для извлечения данных из входного файла Excel на основе заголовков столбцов, предоставленных в качестве входных данных

Утилита Excel

 public Object getExcelData(String sheetName, String colName, int rowNum) {
    
    int col_num=-1;
    int index = workbook.getSheetIndex(sheetName);
    if(index==-1)
        return "";
    
    sheet = workbook.getSheetAt(index);
    
    row = sheet.getRow(0);
    
    for(int i=0;i<row.getLastCellNum();i  )
    {
        if(row.getCell(i).getStringCellValue().trim().equals(colName.trim()))
                col_num=i;
    }
    
    row = sheet.getRow(rowNum -1);
    cell = row.getCell(col_num);
    
    DataFormatter formatter = new DataFormatter();
    Object excelData = formatter.formatCellValue(cell);
    
    return excelData;
            
}
  

Здесь прилагается входной файл, который имеет значения нескольких строк и столбцов
введите описание изображения здесь

Когда я использую служебную программу Excel для доступа к значениям столбцов во 2-й строке, код работает абсолютно нормально

 public class Sample {

    static String excelPath = "./src/main/java/TestData/TestData.xlsx";
        static ExcelUtil2 excel;
    
    public static void main(String[] args) {
        excel = new ExcelUtil2();
        excel.setupExcel(excelPath, "Sheet1");
        //int number = excel.getRowCount(sheet);
        //System.out.println("Rowcount is: " number);
        
        Object result = excel.getExcelData("Sheet1", "Order Total", 2);
        System.out.println(result);
    }
}
  

Вывод = $ 27.66

Та же утилита Excel, которая используется для извлечения значений столбцов 5-й строки, выдает — java.lang .IllegalArgumentException: индекс ячейки должен быть> = 0

 public class Sample {

    static String excelPath = "./src/main/java/TestData/TestData.xlsx";
    //static String sheet = "Sheet1";
    static ExcelUtil2 excel;
    
    public static void main(String[] args) {
        excel = new ExcelUtil2();
        excel.setupExcel(excelPath, "Sheet1");
        //int number = excel.getRowCount(sheet);
        //System.out.println("Rowcount is: " number);
        
        Object result = excel.getExcelData("Sheet1", "Zipcode", 5);
        System.out.println(result);
    }
}
  

Вывод

 Exception in thread "main" java.lang.IllegalArgumentException: Cell index must be >= 0
    at org.apache.poi.xssf.usermodel.XSSFRow.getCell(XSSFRow.java:203)
    at org.apache.poi.xssf.usermodel.XSSFRow.getCell(XSSFRow.java:190)
    at com.qa.vusevapor.Util.ExcelUtil2.getExcelData(ExcelUtil2.java:67)
    at com.qa.vusevapor.Page.Sample.main(Sample.java:17)
  

Ответ №1:

Проблема заключается в методе ie. getExcelData , вы жестко запрограммировали номер строки, т.е. :

  row = sheet.getRow(0);
  

следовательно, он считывает все значения атрибутов из первой строки

В первом случае :

 int rowNum = 2 , 
so 
     row = sheet.getRow(rowNum -1);  // this will give (2-1) =1
     cell = row.getCell(col_num);    // col_num is 7 , since i start with 0 , 
                                     // so cell becomes (1,7) , so it will print Output = $27.66
  

Во втором случае :

    for(int i=0;i<row.getLastCellNum();i  )
    {
        if(row.getCell(i).getStringCellValue().trim().equals(colName.trim()))
                col_num=i;
    }


 
  

здесь colName = ‘Zipcode’, который никогда не будет соответствовать
нулевому номеру строки, и значение col_num=-1 , что вызовет исключение в
потоке «main» java.lang.IllegalArgumentException: индекс ячейки должен быть> = 0

Пожалуйста, найдите мое исправление, это должно работать в обоих случаях:

     public Object getExcelData(String sheetName, String colName, int rowNum) {

    int col_num = -1;
    int index = workbook.getSheetIndex(sheetName);
    if (index == -1)
        return "";

    sheet = workbook.getSheetAt(index);

    row = sheet.getRow(rowNum - 2);

    for (int i = 0; i < row.getLastCellNum(); i  ) {
        if (row.getCell(i).getStringCellValue().trim().equals(colName.trim()))
            col_num = i;
    }

    row = sheet.getRow(rowNum - 1);
    cell = row.getCell(col_num);

    DataFormatter formatter = new DataFormatter();
    Object excelData = formatter.formatCellValue(cell);

    return excelData;

}
  

Комментарии:

1. Спасибо — итак, как мне исправить эту утилиту Excel?

2. попробуйте параметризовать это: row = sheet.GetRow(0);

3. @Bimlesh Я добавил исправление в ответ

4. Спасибо Anurag — это решение отлично работает со всеми сценариями. Не могли бы вы, пожалуйста, помочь мне понять логику row = sheet.GetRow(rowNum — 2);?

5. @Bimlesh в соответствии с вашим тестовым примером вы передаете номер строки = 2, что означает, что вы учитываете номер строки, где у вас есть фактическое значение соответствующего заголовка (общее количество заказов), которое на самом деле имеет номер строки = 1, но в Excel номер строки начинается с нуля, поэтому для указания номера строки 1 нам нужновычтите из параметра, т.е. 2-2 = 0, то же самое для того, где вы указываете номер строки = 5, 5-2 = 3 (это указывает почтовый индекс заголовка), надеюсь, это поможет!