2011-12-16 256 views
5

我試圖讀取使用POI的excel文件,然後我想將該數據放入JTable如何使用POI讀取excel文件的空單元格

這裏是excel文件,

enter image description here

正如你可以看到,有兩個空單元格在上表中,有一次我看上面的數據爲JTable我得到了下面的結果,

enter image description here

在我的JTable中,空單元格移動到了錯誤的地方,我用下面的代碼來得到這個結果,請幫助我實現正確的結果,

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

     } 

    } 

上面我所所做的是將標題和數據行分開的載體在一個名爲xLSContainer類,然後把這些向量爲JTable

這裏是我如何經過谷歌搜索解決它:-)

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

最後,我放棄了POI API,並使用jxl.jar得到了我想要的結果。現在它工作正常。 – Harsha 2011-12-16 05:30:37

回答

14

迭代返回你實際存在的文件中的單元格。如果你試圖複製自己的立場,幾乎肯定不是你想要什麼,而不是你要檢查每個單元又

你可能會希望代碼是這樣的:

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

這段代碼可以讓你依次得到每個單元格,並且也將正確地格式化你的單元格(這樣數字的格式就像他們在Excel中做的那樣)

0

下面的代碼將得到所有基於標題大小。

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() 
    } 
相關問題