POI

2011-12-16 9 views
5

का उपयोग कर एक्सेल फ़ाइल की खाली कोशिकाओं को कैसे पढ़ा जाए, मैंने पीओआई का उपयोग करके एक्सेल फ़ाइल पढ़ने की कोशिश की है और फिर मैं उस डेटा को JTable में रखना चाहता था।POI

यहाँ

एक्सेल फ़ाइल है,

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

अंत में मैंने पीओआई एपीआई छोड़ दी और मुझे परिणाम मिला जो मैं jxl.jar का उपयोग करना चाहता था। यह अभी ठीक काम करता है। – Harsha

उत्तर

14

Iterators आप कोशिकाओं वास्तव में फ़ाइल में मौजूद वापसी है। आप अपनी स्थिति को दोहराने के लिए, कि लगभग निश्चित रूप से आप क्या चाहते हैं नहीं है कोशिश कर रहे हैं, तो इसके बजाय आप बदले में प्रत्येक कोशिका जांचना चाहेंगे

आप की संभावना की तरह कोड कुछ चाहता हूँ:

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() 
    } 
संबंधित मुद्दे