2013-08-06 88 views
7

嗨,我们一直在阅读xls和xlsx文件使用Apache poi我们的Java程序,问题是我们得到空指针异常有两个原因。第一个是我们已经是空白单元格解决了,另一个是当我们选择某个没有任何记录的列时。空指针异常apache poi

我们的程序询问excel文件的路径,然后查看文件的具体图纸编号和你想读..这里的片是用于读取xls文件的代码

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}); 

} 

变量SHEETNAME是Excel文件的表NUM BER

HSSFSheet sheet=wb.getSheetAt(sheetname); 

和变量的cols是为特定的列你想读

cell = row.getCell(cols); 

我们可以读到每个表的第一列,并在第二页第二栏,但是当我编辑我现在测试文件的程序只能读取每片..错误的第一列是空指针exception..wish你能帮助在此先感谢

+1

可以打印异常的堆栈跟踪。如果我们能够知道哪个语句实际上引起了异常,我会帮助的。 –

+0

它有点令人困惑...你正在使用'sheetname',它似乎是一个带有'HSSFSheet sheet = wb.getSheetAt(sheetname);'的字符串。 'getSheetAt'始终接受图纸索引的数值。请确认。 – Sankumarsingh

+0

这是唯一的错误,我得到 java.lang.NullPointerException 顺便说一句,我围绕在上面提到的方法在try catch .. –

回答

5

雷耶斯,

问题是,如果单元格为空,您从不测试!

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

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

作为一般事项,你应该小心,同时处理Cell.getCellType()功能,因为空单元格可能是要么null或者是CELL_TYPE_BLANK

我希望它有帮助。

+0

这有助于非常感谢你.. –

+2

如果你想要,你可以指定一个[MissingCellPolicy](http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Row.MissingCellPolicy.html)控制空白或丢失细胞如何返回给您 – Gagravarr

1

这是我避免Cell NullPoiterException的方法。
你可以试试。祝你好运!

/** 
    * 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(); 
    }