2011-12-16 40 views
5

Tôi đã cố gắng đọc tệp excel bằng POI và sau đó tôi muốn đặt dữ liệu đó vào một JTable.Cách đọc các ô trống của tệp excel bằng POI

Dưới đây là file excel,

enter image description here

Như bạn có thể thấy, có hai ô trống trong bảng trên, một khi tôi đọc dữ liệu trên vào một JTable tôi đã sau kết quả,

enter image description here

Trong số JTable, ô trống đã di chuyển đến địa điểm sai, tôi đã sử dụng các mã sau để nhận kết quả này, vui lòng giúp tôi đạt được kết quả chính xác,

private XLSContainer xLSContainer; 
    Vector cellVectorHolder; 
    private int noOfCells=0; 

    public XLSContainer readXLS(XLSFile xLSFile) { 
     cellVectorHolder = new Vector(); 

     try { 

      FileInputStream inputStream = new FileInputStream(xLSFile.getFileName()); 

      POIFSFileSystem pOIFSFileSystem = new POIFSFileSystem(inputStream); 

      HSSFWorkbook hSSFWorkbook = new HSSFWorkbook(pOIFSFileSystem); 

      HSSFSheet hSSFSheet = hSSFWorkbook.getSheetAt(0); 

      Iterator rowIter = hSSFSheet.rowIterator(); 


      while (rowIter.hasNext()) { 
       HSSFRow row = (HSSFRow) rowIter.next(); 
       if(row.getRowNum()==0){ 
        noOfCells = row.getLastCellNum(); 
       } 
       Iterator cellIter = row.cellIterator(); 

       Vector cellStoreVector = new Vector(); 

       while (cellIter.hasNext()) { 
        HSSFCell hSSFCell = (HSSFCell) cellIter.next(); 
        //System.out.println(hSSFCell.getCellNum()); 
        cellStoreVector.addElement(hSSFCell); 
       } 
       cellVectorHolder.addElement(cellStoreVector); 

      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     feedXLSContainer(); 
     return xLSContainer; 
    }//readXLS 

    private void feedXLSContainer() { 

     xLSContainer = new XLSContainer(); 


     for (int i = 0; i < cellVectorHolder.size(); i++) { 
      Vector cellStoreVector = (Vector) cellVectorHolder.elementAt(i); 
      Vector item = new Vector(); 
      for (int j = 0; j < cellStoreVector.size(); j++) { 
       HSSFCell cell = (HSSFCell) cellStoreVector.elementAt(j); 
       item.add(cell.toString()); 
      } 
      if (i == 0) { 
       xLSContainer.addHeader(item); 
      } else { 
       xLSContainer.addRow(item); 
      } 

     } 

    } 

Những gì tôi đã làm ở trên được đặt tiêu đề và các hàng dữ liệu vào vector riêng biệt trong một lớp được gọi là xLSContainer và sau đó đặt những vectơ thành một JTable.

Dưới đây là cách tôi đã giải quyết nó sau khi tìm kiếm google hơn :-)

private XLSContainer xLSContainer; 

    public XLSContainer readXLS(XLSFile xLSFile) { 
     try { 

      WorkbookSettings ws = new WorkbookSettings(); 
      ws.setLocale(new Locale("en", "EN")); 
      Workbook workbook = Workbook.getWorkbook(new File(xLSFile.getFileName()), ws); 
      Sheet s = workbook.getSheet(0); 
      System.out.println("Sheet Content::" + s.getName()); 
      readDataSheet(s); 
      workbook.close(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return xLSContainer; 

    } 

    private void readDataSheet(Sheet s) { 
     xLSContainer = new XLSContainer(); 

     int noOfRows = s.getRows(); 
     int noOfCols = s.getColumns(); 



     for (int i = 0; i < noOfRows; i++) { 
      Vector item = new Vector(); 
      for (int j = 0; j < noOfCols; j++) { 

       if (s.getCell(j, i).getContents() == "") { 
        item.add(""); 

       } else { 
        item.add(s.getCell(j, i).getContents()); 

       } 
      } 

      if (i == 0) { 
       xLSContainer.addHeader(item); 
      }else{ 
       xLSContainer.addRow(item); 
      } 
     } 
    } 
+0

Cuối cùng tôi đã từ bỏ POI API và tôi nhận được kết quả tôi muốn bằng cách sử dụng jxl.jar. Nó hoạt động tốt ngay bây giờ. – Harsha

Trả lời

14

Các vòng lặp trở lại cho bạn những tế bào thực sự tồn tại trong tập tin. Nếu bạn đang cố gắng để tái tạo các vị trí của họ, điều đó gần như chắc chắn không phải là những gì bạn muốn, thay vào đó bạn sẽ muốn kiểm tra mỗi tế bào lần lượt

Bạn có thể sẽ muốn mã gì đó như:

workbook.setMissingCellPolicy(MissingCellPolicy.RETURN_BLANK_AS_NULL); 
DataFormatter fmt = new DataFormatter(); 

for(int sn=0; sn<workbook.getNumberOfSheets(); sn++) { 
    Sheet sheet = workbook.getSheetAt(sn); 
    for (int rn=sheet.getFirstRowNum(); rn<=sheet.getLastRowNum(); rn++) { 
     Row row = sheet.getRow(rn); 
     if (row == null) { 
     // There is no data in this row, handle as needed 
     } else { 
     // Row "rn" has data 
     for (int cn=0; cn<row.getLastCellNum(); cn++) { 
      Cell cell = row.getCell(cn); 
      if (cell == null) { 
       // This cell is empty/blank/un-used, handle as needed 
      } else { 
       String cellStr = fmt.formatCell(cell); 
       // Do something with the value 
      } 
     } 
     } 
    } 
} 

Mã này sẽ cho phép bạn nhận được tại mỗi ô lần lượt, và cũng sẽ định dạng chính xác các ô của bạn (để các số được định dạng giống như trong Excel)

0

Mã sau sẽ nhận tất cả các giá trị ô dựa trên kích thước tiêu đề.

public String getRowValueAsString(Row row, 
    int sizeOfHeader, String colSep) { 

     StringBuffer sBuf = new StringBuffer(); 
     for (int i = 0; i < sizeOfHeader; i++) { 
      Cell cell = row.getCell(i); 
      if(cell == null) { 
       sBuf.append(colSep); 
       continue; 
      } 
      switch (cell.getCellType()) { 

      case Cell.CELL_TYPE_NUMERIC: 
       if (DateUtil.isCellDateFormatted(cell)) { 
        sBuf.append(format.format(cell.getDateCellValue()) + colSep); 
       } 
       else{ 
        sBuf.append(cell.getNumericCellValue() + colSep); 
       } 
       break; 
      case Cell.CELL_TYPE_STRING: 
        sBuf.append(cell.getStringCellValue() + colSep); 
       break; 
      case Cell.CELL_TYPE_FORMULA: 
       sBuf.append(cell.getCellFormula() + colSep); 
       break; 
      case Cell.CELL_TYPE_BLANK: 
       sBuf.append(" "+colSep); 
       break; 
      case Cell.CELL_TYPE_BOOLEAN: 
       sBuf.append(cell.getBooleanCellValue()+ colSep); 
       break; 
      case Cell.CELL_TYPE_ERROR: 
       sBuf.append(cell.getErrorCellValue() + colSep); 
       break; 
      default: 
       sBuf.append(cell.getStringCellValue() + colSep); 
       break; 
      } 
     } 
     return sBuf.toString() 
    } 
Các vấn đề liên quan