2011-12-16 3 views
5

Я попытался прочитать файл excel с помощью POI, а затем я хотел поместить эти данные в JTable.Как читать пустые ячейки файла excel с использованием POI

Вот файл 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.

Вот как я решил его после нескольких поисков Google :-)

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

Наконец-то я отказался от API POI и получил результат, который я хотел использовать jxl.jar. Теперь он отлично работает. – Harsha

ответ

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() 
    } 
Смежные вопросы