2015-07-01 2 views
0

Я пытаюсь прочитать данные из одного .xlsx и поместить его в другой файл. Ошибка происходит, когда цикл работает во второй раз. Нет пустых ячеек, и все 187 строк имеют в них данные (проверены и проверены). В нем есть только один столбец с данными (первый столбец A), поэтому я не использую Null Checker. Вот код, который у меня есть. Я не включаю код для записи и закрытия файла, поскольку ошибка возникает во время второй итерации цикла.Использование POI throws java.lang.NullPointerException

FileInputStream fis=new FileInputStream("C:\\test\\Migration_input.xlsx"); 


    XSSFWorkbook wb = new XSSFWorkbook(fis); 
    XSSFSheet sheet = wb.getSheetAt(0); 
    int rowCount = sheet.getLastRowNum(); 
    System.out.println(rowCount); 

    FileOutputStream fos=new FileOutputStream("C:\\test\\Migration.xlsx"); 

    for (int b=0; b<rowCount;b++) 
    { 

     System.out.println(b); 

     //This part to read from existing file 

     XSSFRow rowreader=sheet.getRow(b); 
     XSSFCell cellreader = rowreader.getCell(0); 
     **String cellinput = cellreader.getStringCellValue(); //Errors out on this line on second iteration - It is not a null value and has some string data in it. 

     //This part to write in a different file 

     XSSFRow rowwriter=sheet.createRow(b+1); 
     XSSFCell cellwriter= rowwriter.createCell(2); 
     System.out.println(cellinput); 
     cellwriter.setCellType(cellwriter.CELL_TYPE_STRING); 
     cellwriter.setCellValue(cellinput); 
     System.out.println("done");  
    } 

Я изменил код этого, но по-прежнему кажется, что имеет ошибку:

for (int b=0; b<rowCount;b++) 
     { 

     System.out.println(b); 

     //This part to read from existing file 
     XSSFRow rowreader=sheet.getRow(b); 
     XSSFCell cellreader = rowreader.getCell(0); 
     System.out.println(cellreader.getStringCellValue()); 
     **cellinput[b] = cellreader.getStringCellValue(); //Errors out  
     System.out.println("stored in array string all the values"); 
     } 

А вот обновленное OUTPUT

0 
Academic Cert Expected Date 
FAILED: get_labels 
java.lang.NullPointerException 
at crm_migration.labels_on_given_object.get_labels(labels_on_given_object.java:99) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84) 
at org.testng.internal.Invoker.invokeMethod(Invoker.java:714) 

считывает значение из формата XLSX отлично, но когда я пытаюсь сохранить его в массив строк, то есть когда он выдает ошибку сейчас. Я разделил цикл так, чтобы он читал только сейчас и сохраняет значение в массиве **, опять же в первом столбце A нет нулевых значений с 187 строками. Пожалуйста помогите.

+0

какой из них - линия 64? –

+1

Ошибка возникает из-за того, что вы читаете и записываете в том же файле. 'XSSFRow rowwriter = sheet.createRow (b + 1);' ваш лист переменных здесь такой же, как тот, который вы читаете, если отсутствует код. Если отсутствует код, исправьте свой вопрос. –

+0

Тот, который помечен как ошибка, используя ** и комментарий. –

ответ

0

Считанные логик вы реализовали это wrong.First создать цикл по всем строкам, а затем цикл по значениям ячеек в каждой строке

//This part to read from existing file 

    //Create a loop over all the rows of excel file to read it 

    for (int b=0; b<=rowCount;b++) 
      { 

       Row row = sheet.getRow(b); 

       //loop to print cell values in a row 

       for (int j = 0; j < row.getLastCellNum(); j++) { 

        String cellinput=row.getCell(j).getStringCellValue(); 

        System.out.println(cellinput); 
    } 
    } 

Аналогично реализации логики записи

Я протестировал над кодом он работает нормально. Вернитесь назад, если у вас возникнут проблемы

+0

И строки, и ячейки могут быть нулевыми, вам нужно проверить это. См. [Apache POI docs] (http://poi.apache.org/spreadsheet/quick-guide.html#Iterator) для более – Gagravarr

+0

Привет @Gagravarr да, я знаю, но в вопросе упоминается, что в листе нет пустых ячеек и все строки имеют данные. Так же не использовали нулевую проверку. Но да, всегда хорошо иметь нулевую проверку – Vicky

+1

Мне не хватает следующего кода: 'cellinput = new String [rowCount];' –

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