2013-08-06 29 views
7

Hallo haben wir xls und xlsx Datei lesen mit Apache Poi in unserem Java-Programm, das Problem ist, dass wir null Zeiger Ausnahme mit zwei Gründen bekommen .. die erste 1 ist die leere Zelle, die wir bereits gelöst und der andere ist, wenn wir eine bestimmte Spalte auswählen, die keinen Datensatz hat ..Null Zeiger Ausnahme Apache Poi

unser Programm fragt nach dem Pfad der Excel-Datei dann die spezifische Blattnummer der Datei und die spezifische Spaltennummer von das Blatt, das Sie .. hier lesen wollen, ist der Code für

xls-Datei zu lesen
public void readXLSFile()throws IOException{ 
    InputStream ExcelFileToRead = new FileInputStream(path); 
    HSSFWorkbook wb = new HSSFWorkbook(ExcelFileToRead); 


    HSSFSheet sheet=wb.getSheetAt(sheetname); 
    HSSFRow row; 
    HSSFCell cell; 

    Iterator rows = sheet.rowIterator(); 

      list1.clear(); 

    while (rows.hasNext()) 
    { 
        headers.clear(); 
     row=(HSSFRow) rows.next(); 

       // Iterator cells = row.cellIterator(); 

        headers.add("contents"); 


      cnt = cnt+1; 

      cell = row.getCell(cols); 
      if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING) 
      { 
       //System.out.println(cell.getStringCellValue()+"(string)"); 
       list.add(cell.getStringCellValue()); 
            d.add(cell.getStringCellValue()); 
            list1.add(new KeyValuePair(cell.getStringCellValue(),"")); 
      } 
      else if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) 
      { 
       //System.out.println(cell.getNumericCellValue()+"(numeric)"); 
       double num = cell.getNumericCellValue(); 
       String num2 = String.valueOf(num); 
       list.add(num2); 
            d.add(num2); 
            list1.add(new KeyValuePair(num2,"")); 

      } 
      else if(cell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN) 
      { 
       //System.out.println(cell.getBooleanCellValue()+"(boolean)"); 
       String bool = String.valueOf(cell.getBooleanCellValue()); 
       list.add(bool); 
            d.add(bool); 
            list1.add(new KeyValuePair(bool,"")); 
      } 
      else 
      { 
       //U Can Handel Boolean, Formula, Errors 
      } 


     //System.out.println(); 
    } 
     arrey = list.toArray(new String[list.size()]); 
        data.add(d); 
        // System.out.println(data); 


        model = new DefaultTableModel(); 
        table_1.setModel(model); 


        table_1.setModel(model); 
         model.setColumnIdentifiers(new String[] {"row","contents"}); 

        for (KeyValuePair p : list1){ 


         int nor=table_1.getRowCount(); 

         int n2 = nor +1; 
         n1 = Integer.toString(n2); 
        // model.addColumn(new String [] {n1}); 


         model.addRow(new String[] {n1,p.key, p.value}); 


        } 
        // model.addColumn(new String[] {n1}); 

} 

die Variable Sheetname für das Blatt num die Excel-Datei ist ber

HSSFSheet sheet=wb.getSheetAt(sheetname); 

und die variablen cols ist für die spezifische Spalte Sie

cell = row.getCell(cols); 

wir lesen können, die erste Spalte von jedem Blatt und auch die zweite Säule des zweiten Blattes lesen mögen, aber wenn ich bearbeiten mein Test nun die Programmdatei nur die erste Spalte von jedem Blatt lesen kann .. der Fehler null-Zeiger exception..wish Sie dank im Voraus

+1

können Sie den Stack-Trace der Ausnahme drucken. Ich werde helfen, wenn wir wissen könnten, welche Aussage tatsächlich eine Ausnahme verursacht. –

+0

Es ist ein wenig verwirrend ... Sie verwenden 'sheetname', der ein String mit' HSSFSheet sheet = wb.getSheetAt (sheetname); 'zu sein scheint. 'getSheetAt' akzeptiert immer numerischen Wert für Blatt Index. Bitte bestätigen. – Sankumarsingh

+0

Dies ist der einzige Fehler im bekommen java.lang.NullPointerException nebenbei, ich umrunden die oben genannten Methode in Versuch fangen .. –

Antwort

5

reyes helfen könnten,

Das Problem besteht darin, dass Sie nie testen, ob die Zelle null ist!

if (cell == null) 
{ 
    System.out.println("Cell is Empty in Column:" + cols); 

} else if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING) 
{ 
    //code 
} 

Als allgemeine Angelegenheit, sollten Sie vorsichtig sein, während Cell.getCellType() Funktion der Handhabung, da eine leere Zelle entweder null oder ein CELL_TYPE_BLANK sein könnte.

Ich hoffe, es hat geholfen.

+0

das hilft vielen Dank .. –

+2

Sie können eine [MissingCellPolicy] (http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Row.MissingCellPolicy.html) angeben, wenn Sie möchten Kontrollieren Sie, wie leere oder fehlende Zellen an Sie zurückgegeben werden – Gagravarr

1

Dies ist mein Weg, Zelle NullPoiterException zu vermeiden.
Können Sie es versuchen. Viel Glück!

/** 
    * Get string value of {@link Cell} object 
    * 
    * @param cell 
    *   {@link Cell} object 
    * @return String value of {@link Cell} object 
    */ 
    private static String getCellValueString(Cell cell) { 
     String value=""; 
     if(cell!=null) { 
      switch(cell.getCellType()){ 
       case Cell.CELL_TYPE_BOOLEAN: 
        value=String.valueOf(cell.getBooleanCellValue()); 
        break; 
       case Cell.CELL_TYPE_NUMERIC: 
        value=BigDecimal.valueOf(
         cell.getNumericCellValue()).toPlainString(); 
        break; 
       case Cell.CELL_TYPE_STRING: 
        value=String.valueOf(cell.getStringCellValue()); 
        break; 
       case Cell.CELL_TYPE_FORMULA: 
        value=String.valueOf(cell.getCellFormula()); 
        break; 
       case Cell.CELL_TYPE_BLANK: 
        value=""; 
        break; 
      } 
     } else { 
      logger.error("Cell is null"); 
     } 
     return value.trim(); 
    }