#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 (это указывает почтовый индекс заголовка), надеюсь, это поможет!