2011-09-30 15 views
40

मैं Excel फ़ाइल से मान प्राप्त करने के लिए अपाचे पीओआई एपीआई का उपयोग कर रहा हूं। सब कुछ सूत्रों वाले कोशिकाओं को छोड़कर महान काम कर रहा है। वास्तव में, cell.getStringCellValue() सेल में प्रयुक्त सूत्र को वापस कर रहा है न कि सेल का मूल्य।जावा पीओआई: Excel सेल मान को कैसे पढ़ा जाए और सूत्र को कंप्यूटिंग नहीं किया जाए?

मैं evaluateFormulaCell() विधि का उपयोग करने की कोशिश की लेकिन यह काम कर रहा हूं क्योंकि मैं GETPIVOTDATA एक्सेल सूत्र का उपयोग कर रहा हूँ और इस सूत्र एपीआई में लागू नहीं किया गया:

Exception in thread "main" org.apache.poi.ss.formula.eval.NotImplementedException: Error evaluating cell Landscape!K11 
    at org.apache.poi.ss.formula.WorkbookEvaluator.addExceptionInfo(WorkbookEvaluator.java:321) 
    at org.apache.poi.ss.formula.WorkbookEvaluator.evaluateAny(WorkbookEvaluator.java:288) 
    at org.apache.poi.ss.formula.WorkbookEvaluator.evaluate(WorkbookEvaluator.java:221) 
    at org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator.evaluateFormulaCellValue(HSSFFormulaEvaluator.java:320) 
    at org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator.evaluateFormulaCell(HSSFFormulaEvaluator.java:213) 
    at fromExcelToJava.ExcelSheetReader.unAutreTest(ExcelSheetReader.java:193) 
    at fromExcelToJava.ExcelSheetReader.main(ExcelSheetReader.java:224) 
Caused by: org.apache.poi.ss.formula.eval.NotImplementedException: GETPIVOTDATA 
    at org.apache.poi.hssf.record.formula.functions.NotImplementedFunction.evaluate(NotImplementedFunction.java:42) 

उत्तर

88

सूत्र कोशिकाओं के लिए, दो चीजों उत्कृष्टता भंडार। एक फ़ॉर्मूला ही है, दूसरा "कैश" मूल्य है (अंतिम मूल्य जिसे फोरमला का मूल्यांकन किया गया था)

यदि आप अंतिम कैश मान प्राप्त करना चाहते हैं (जो अब सही नहीं हो सकता है, लेकिन जब तक Excel फ़ाइल को बचाया और आप इसे यह होना चाहिए नहीं बदला है), तो आप की तरह कुछ चाहता हूँ:

for(Cell cell : row) { 
    if(cell.getCellType() == Cell.CELL_TYPE_FORMULA) { 
     System.out.println("Formula is " + cell.getCellFormula()); 
     switch(cell.getCachedFormulaResultType()) { 
      case Cell.CELL_TYPE_NUMERIC: 
       System.out.println("Last evaluated as: " + cell.getNumericCellValue()); 
       break; 
      case Cell.CELL_TYPE_STRING: 
       System.out.println("Last evaluated as \"" + cell.getRichStringCellValue() + "\""); 
       break; 
     } 
    } 
} 
+1

हाँ, यह काम करता है। अच्छी तरह से किया गया :) – Aminoss

+6

यदि यह काम करता है, तो जवाब को 'स्वीकार' करना याद रखें। – Wivani

+1

कैश की तारीखों के बारे में कैसे? तिथि कक्षों को फ़्लैग किया जाता है Cell.CELL_TYPE_NUMERIC। –

0

एक विकल्प के आदेश जहाँ आप एक सेल जहां फार्मूले पर डाल दिया जाता है के कच्चे मूल्य प्राप्त कर सकते हैं नहीं है । यह रिटर्न प्रकार स्ट्रिंग है। उपयोग:

cell.getRawValue(); 
+0

वह विधि मेरे लिए [POI javadocs में] नहीं दिखा रही है (https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html), क्या आप वाकई अपना उत्तर लागू करते हैं यह पुस्तकालय? – Gagravarr

+0

यहां एक नज़र डालें: https://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFCell.html –

+1

आह, यह केवल एक्सएसएसएफ है। आपको यह स्पष्ट करना चाहिए, क्योंकि सामान्य एसएस मॉडल में यह नहीं है, और न ही एचएसएसएफ – Gagravarr

2

से ऊपर सुझाव मुझे cell.getRawValue के लिए काम नहीं किया() AUT पर एक्सेल सेल में के रूप में एक ही सूत्र लौटे तो समारोह नीचे लिखा था और यह काम किया:

public void readFormula() throws IOException { 
    FileInputStream fis = new FileInputStream("Path of your file"); 
    Workbook wb = new XSSFWorkbook(fis); 
    Sheet sheet = wb.getSheetAt(0); 
    FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator(); 

    CellReference cellReference = new CellReference("C2"); //pass the cell which contains formula 
    Row row = sheet.getRow(cellReference.getRow()); 
    Cell cell = row.getCell(cellReference.getCol()); 

    CellValue cellValue = evaluator.evaluate(cell); 

    switch (cellValue.getCellType()) { 
     case Cell.CELL_TYPE_BOOLEAN: 
      System.out.println(cellValue.getBooleanValue()); 
      break; 
     case Cell.CELL_TYPE_NUMERIC: 
      System.out.println(cellValue.getNumberValue()); 
      break; 
     case Cell.CELL_TYPE_STRING: 
      System.out.println(cellValue.getStringValue()); 
      break; 
     case Cell.CELL_TYPE_BLANK: 
      break; 
     case Cell.CELL_TYPE_ERROR: 
      break; 

     // CELL_TYPE_FORMULA will never happen 
     case Cell.CELL_TYPE_FORMULA: 
      break; 
    } 

} 
संबंधित मुद्दे