2013-12-02 3 views
0

Я использую Selenium 2 и создал файл LoginTest.java, который читается из файла excel с данными. Я читаю имя пользователя и пароль и запускаю его на странице входа. На самом деле это нормально. Данные выглядит следующим образом:Чтение значений ячейки из файла excel с использованием Apache POI

user1 PW1
user2 pw2
user3 PW3
user4 PW4

Проблема заключается в следующем: если я изменить файл первенствовать и изменить количество аргументов, к чему-то вроде этого :

user1 PW1
user2 pw2

и запустить тот же сценарий, то ReadExcel файл класса г eturns the error msg:

«Нет поддержки для этого типа ячеек».

Что происходит, я думаю, что строки 3 и 4 использовали содержать данные в своих клетках (user3 PW3 и user4 PW4), и теперь они не ... так что есть что-то другое о тех, ранее используемые ячейки, которые мой класс ExcelRead() не ловит, чтобы игнорировать. Я буду держать пари, что ячейка теперь «null», где она раньше не была или наоборот. Что-то по-разному относится к ячейкам, которые ранее содержали данные против ячеек, которые никогда не содержали данные.

(я нашел ExcelRead в Интернете и использую его. Я сам не создал его с нуля. Кажется, что он отлично работает с файлами xcel, за исключением этой «проблемы»).

Спасибо за любую помощь.

public class ExcelRead { 
    public Object[][] main(String[] args) throws Exception{   
    File excel = new File(args[0]); 
    FileInputStream fis = new FileInputStream(excel); 
    HSSFWorkbook wb = new HSSFWorkbook(fis); 
    HSSFSheet ws = wb.getSheet(args[1]); 

    int rowNum = ws.getLastRowNum() + 1; 
    int colNum = ws.getRow(0).getLastCellNum(); 
    String[][] data = new String[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); 
       String value = cellToString(cell); 
       data[i][j] = value ; 
       //System.out.println("the value is " + value); 
      } 
     } 
    return data; 
    } 

public static String 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; 
     default: 
      throw new RuntimeException("There is no support for this type of cell");       
    } 

    return result.toString(); 
} 

ответ

1

Код, который вы загрузили, использует библиотеку Java Apache POI для чтения файла excel. Если вы пройдете через код, вы увидите, что метод cellToString() не обрабатывает все типы типов ячеек - он ищет только числовые и строковые ячейки и выдает исключение, которое вы видите иначе.

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

Вам необходимо продлить switch заявление в методе cellToString() для обработки других типов клеток, таких как Cell.CELL_TYPE_BLANK, Cell.CELL_TYPE_BOOLEAN и т.д.

Обратитесь к Apache POI documentation на интерфейсе Cell, чтобы увидеть, что различные типы клеток и как обрабатывать каждый.

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

    switch (type) { 

     case Cell.CELL_TYPE_NUMERIC: // numeric value in Excel 
     case Cell.CELL_TYPE_FORMULA: // precomputed value based on formula 
      result = cell.getNumericCellValue(); 
      break; 
     case Cell.CELL_TYPE_STRING: // String Value in Excel 
      result = cell.getStringCellValue(); 
      break; 
     case Cell.CELL_TYPE_BLANK: 
      result = ""; 
     case Cell.CELL_TYPE_BOOLEAN: //boolean value 
      result: cell.getBooleanCellValue(); 
      break; 
     case Cell.CELL_TYPE_ERROR: 
     default: 
      throw new RuntimeException("There is no support for this type of cell");       
    } 

    return result.toString(); 
} 
+0

Да, я понимаю, что сейчас, спасибо. Я добавил в оператор switch для проверки пустого, но цикл for возвращает пустое, однако, я бы хотел, чтобы это произошло, когда я удаляю данные в строке, чтобы строка не возвращалась вообще. Думаю, я не понимаю, как количество строк определяется классом POI. В моем примере я удалил строки 3 и 4, но метод ExcelRead все еще возвращает 4 строки (2 с данными и 2 с пробелами). – RalphF

+1

У вас есть пустые строки с пустыми ячейками. Если вы просто хотите избавиться от этого, удалите строки, щелкнув правой кнопкой мыши на заголовке строки слева от строк, а затем нажав «Удалить» в контекстном меню. Это оставит вам только строки с данными. – Faiz

+0

Я получаю это, но я хотел знать, какая разница в ячейке между данными удаленных ячеек и ячейкой, в которой никогда не было данных? – RalphF

0

Добавить это.

case 3: break; 

На самом деле вам нужно проверить на пустой тип клеток (HSSFCell.CELL_TYPE_BLANK).

Также, что вы можете сделать, если вы найдете пустую ячейку, останавливает цикл for с i=rowNum.

Существует более двух типов ячеек.Метод getCellType() может вернуть эти числа:

Cell.CELL_TYPE_NUMERIC, Cell.CELL_TYPE_STRING, Cell.CELL_TYPE_FORMULA, Cell.CELL_TYPE_BLANK, Cell.CELL_TYPE_BOOLEAN, Cell.CELL_TYPE_ERROR 

Отредактировано:

По наблюдению Faiz, это получит исключение, как Object result не инициализируется и неназначенный. Вместо этого напишите case 3: return "";, он вернет пустую строку, когда будет найдена пустая ячейка. Во всяком случае, ваш алгоритм не самый эффективный. Вместо поиска по заданной большой области вы должны искать ячейки, пока не найдете пустые ячейки (если в вашем листе нет пустой строки). Вы должны иметь возможность использовать ArrayList вместо Array и, таким образом, полностью избегать обработки пустой строки во время процесса проверки пароля.

+0

«return result.toString();' будет выдавать ошибку, поскольку в этом случае «result» не было присвоено значение. вы должны присвоить значение 'result'. – Faiz

+0

Мой выход теперь это: PASSED: LoginTest ("а", "б", NULL, NULL) PASSED: LoginTest ("с", "d", NULL, NULL) PASSED: LoginTest (NULL, NULL , NULL, NULL) ПРОШЛО: LoginTest (NULL, NULL, NULL, NULL) Мои первенствует данные: \t б с \t d Так что я ожидал увидеть в выходе: ПРОШЛО: LoginTest («a», «b») PASSED: LoginTest («c», «d») Я добавил проверку значения для пустой строки («») для (int j = 0; j RalphF

+1

Faiz прав, посмотрите мое редактирование. –

Смежные вопросы