2013-08-06 45 views
7

hi chúng tôi đã đọc xls và xlsx tập tin bằng cách sử dụng apache poi ing chương trình java của chúng tôi, vấn đề là chúng tôi đang nhận được ngoại lệ con trỏ null với hai lý do .. đầu tiên 1 là ô trống mà chúng tôi đã giải quyết và cách khác là khi chúng tôi chọn một cột nhất định không có bất kỳ bản ghi nào ..không có con trỏ ngoại lệ apache poi

chương trình của chúng tôi yêu cầu đường dẫn của tệp excel sau đó số trang tính cụ thể của tệp và số cột cụ thể của trang tính bạn muốn đọc .. dưới đây là mã để đọc tệp 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}); 

} 

biến sheetname là cho trang tính của tệp excel ber

HSSFSheet sheet=wb.getSheetAt(sheetname); 

và cols biến là cho cột cụ thể mà bạn muốn đọc

cell = row.getCell(cols); 

chúng ta có thể đọc cột đầu tiên của mỗi tờ và cũng là cột thứ hai của bảng thứ hai nhưng khi tôi thay đổi nội dung tập tin thử nghiệm của tôi chương trình bây giờ chỉ có thể đọc cột đầu tiên của mỗi tờ .. lỗi là null con trỏ ngoại lệ .. bạn có thể giúp cảm ơn trước

+1

bạn có thể in theo dõi ngăn xếp của ngoại lệ hay không. Tôi sẽ giúp đỡ nếu chúng ta có thể biết được tuyên bố nào thực sự gây ra ngoại lệ. –

+0

Hơi khó hiểu một chút ... Bạn đang sử dụng 'sheetname' có vẻ như là một String với' HSSFSheet sheet = wb.getSheetAt (sheetname); '. 'getSheetAt' luôn chấp nhận giá trị số cho chỉ mục trang tính. Vui lòng xác nhận. – Sankumarsingh

+0

đây là lỗi duy nhất im nhận được java.lang.NullPointerException bằng cách này, tôi bao quanh phương pháp được đề cập ở trên để thử bắt .. –

Trả lời

5

reyes,

Vấn đề là bạn không bao giờ thử nghiệm nếu ô là null!

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

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

Như một vấn đề chung, bạn nên cẩn thận khi xử lý Cell.getCellType() chức năng, từ một ô trống có thể là một trong hai null hoặc là một CELL_TYPE_BLANK.

Tôi hy vọng điều đó sẽ hữu ích.

+0

điều này giúp cảm ơn bạn rất nhiều .. –

+2

Bạn có thể chỉ định [MissingCellPolicy] (http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Row.MissingCellPolicy.html) nếu bạn muốn kiểm soát cách các ô trống hoặc bị thiếu được trả lại cho bạn – Gagravarr

1

Đây là cách của tôi để tránh Cell NullPoiterException.
Bạn có thể thử nó không. Chúc may mắn!

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