2011-04-19 21 views
8

मेरे पास मेरे शीट की कोशिकाओं में कुछ सूत्र हैं, और मैं कुछ मान डालने के बाद उनका मूल्यांकन करना चाहता हूं। उदाहरण के लिए:अपाचे पीओआई फॉर्मूला का मूल्यांकन

मेरे सूत्र =SUM(B1,B2)

से पहले मान प्रविष्टि B1 मूल्य 1 था, और B2 मूल्य 3 था, और सूत्र परिणाम 4

के बाद मूल्यों की प्रविष्टि अब बी 1 मूल्य 5 है, और बी 2 है मूल्य 2 है लेकिन सूत्र अभी भी 4 का उत्पादन करता है, मैं मूल्यांकन कैसे किया जा सकता/मूल्यांकन कर सकता हूं?

स्वाभाविक रूप से सूत्र सूत्र पर रिटर्न बटन हिट करने के बाद नया मान 7 की गणना की जाती है, क्या मैन्युअल बातचीत के बिना इसे ट्रिगर करने का कोई तरीका है?

मैं Excel 2007 का उपयोग कर रहा है ताकि XSSFWorkbook

संपादित करें/अद्यतन:

मैं Gabors समाधान का उपयोग किया है इससे पहले कि वह इसे पोस्ट लेकिन मैं एक संदर्भ के रूप में उपयोग कर रहा हूँ, यहाँ क्या होता है :

public XSSFFormulaEvaluator getEvaluator(){ 
     if(evaluator == null){ 
      evaluator = new XSSFFormulaEvaluator(wb); 
     } 
     return evaluator; 
    } 
:

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.poi.ss.formula.WorkbookEvaluator.<init>(Lorg/apache/poi/ss/formula/EvaluationWorkbook;Lorg/apache/poi/ss/formula/IStabilityClassifier;Lorg/apache/poi/hssf/record/formula/udf/UDFFinder;)V 
     at org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator.<init>(XSSFFormulaEvaluator.java:64) 
     at org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator.<init>(XSSFFormulaEvaluator.java:51) 
............... 
............... 

यहाँ प्रासंगिक कोड का एक हिस्सा है

वास्तव में लागू मूल्यांकनकर्ता:

//where index is int, and mycell is int 
row = (XSSFRow) sheet.getRow(index); 
cell = row.createCell(mycell); 
getEvaluator().evaluateFormulaCell(cell); 

मैं किसी के लिए देख रहा हूँ इस का इस्तेमाल किया और सफल, वास्तव में यह कोशिश कर के बिना नहीं जो लोग गूगल समाधान था, मैं कम से कम कहने के लिए एक बहुत googling किया गया है।

प्रति Gagravar सुझाव मैं अपने classpath पर 2 POIs है:

 <dependency> 
     <groupId>org.apache.poi</groupId> 
     <artifactId>poi</artifactId> 
     <version>3.8-beta1</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.poi</groupId> 
     <artifactId>poi-ooxml</artifactId> 
     <version>3.7</version> 
    </dependency> 

मैं हालांकि मैं XSSF कार्यपुस्तिका आदि के लिए 3.7 संस्करण की आवश्यकता

समाधान:

<dependency> 
      <groupId>org.apache.poi</groupId> 
      <artifactId>poi</artifactId> 
      <version>3.8-beta2</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.poi</groupId> 
      <artifactId>poi-ooxml</artifactId> 
      <version>3.8-beta2</version> 
     </dependency> 
+1

NoSuchMethodError मुझे इंगित करता है कि आपके क्लासपाथ पर पीओआई जार की दो प्रतियां हैं। सुनिश्चित करें कि आपके पास केवल एक है तो इसे ठीक काम करना चाहिए – Gagravarr

+0

@Gagravarr कृपया मेरे अपडेट – ant

+0

देखें यह आपकी समस्या है। आपके पीओआई संस्करणों को मिलान करने की आवश्यकता है। आप मुख्य पीओआई जार, और poi-ooxml दोनों के लिए 3.8-बीटा 1 (या यहां तक ​​कि बेहतर 3.8-बीटा 2) चाहते हैं। आप संस्करणों के बीच पीओआई जार मिश्रण और मैच नहीं कर सकते! – Gagravarr

उत्तर

12

एक जवाब के लिए एक टिप्पणी ...

आप सबसे पहले यह सुनिश्चित करना है कि आप मुख्य जार के लिए POI के समान संस्करण का उपयोग कर रहे है, और OOXML हिस्सा बढ़ावा देने के लिए। आपका मैवेन स्निपेट एक के लिए 3.7 दिखा रहा था, और दूसरे के लिए 3.8 बीटा 1 दिखा रहा था। आपको यह सुनिश्चित करने की ज़रूरत है कि वे दोनों एक जैसे हैं। (आप 3.8-बीटा 2 का भी उपयोग करना चाहेंगे जो अभी बाहर है)।

फिर, का उपयोग या तो:

FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator(); 
evaluator.evaluateFormulaCell(cell); 

या:

XSSFFormulaEvaluator.evaluateAllFormulaCells(wb); 

यदि आप उपयोग HSSF कोशिश अधिक जानकारी के

+2

यह उम्मीद है कि वहां कुछ गरीब आत्मा की मदद मिलेगी, धन्यवाद – ant

+0

2017 से नमस्कार :) उत्तर के लिए धन्यवाद! यह वही है जो मैं देख रहा था :) FYI 'मूल्यांकनateFormulaCell' को poi 3.17 और 'formulaEvaluator.evaluateInCell (सेल) में बहिष्कृत किया गया है, इसके बजाय इसका उपयोग किया जाना चाहिए। –

+0

@VladimirVagaytsev मुझे लगता है कि आप गलत हैं - [मूल्यांकन FormulaCell] (http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/FormulaEvaluator.html#evaluateFormulaCell-org.apache.poi.ss। usermodel.Cell-) un-deprecated बनी हुई है! 'मूल्यांकन करेंसेल 'कुछ अलग करता है, यह eval के परिणाम के साथ सूत्र को बदल देता है – Gagravarr

3

शायद XSSFFormulaEvaluator.evaluateAllFormulaCells(XSSFWorkbook wb)?

(या अधिक विशेष:। evaluateFormulaCell(Cell cell))

यह काम नहीं करता है: आप POI किस संस्करण का उपयोग कर रहे हैं? एक्सएसएसएफ में सूत्र v3.5 से समर्थित हैं।

इसके अलावा, द्वारा सुझाए गए फॉर्मूला मूल्यांकनकर्ता को तत्काल करने के लिए XSSFCreationHelper का उपयोग करने का प्रयास करें।

+0

कृपया मुझे बताओ कि बस इतना गुमराह नहीं है? क्या आपने वास्तव में इसका सफलतापूर्वक उपयोग किया है? – ant

+0

http://poi.apache.org/spreadsheet/eval.html देखें - गैबर ने सुझाव दिया कि क्या ठीक काम करना चाहिए। – Gagravarr

+0

@Gagravarr मैंने पहले से ही किया है, क्या आपने कभी इसका सफलतापूर्वक उपयोग किया है? – ant

0

आप उपयोग कर सकते हैं टी उनके।

public static void triggerFormula(HSSFWorkbook workbook){  

       FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator(); 
       HSSFSheet sheet = workbook.getSheetAt(0); 
       int lastRowNo=sheet.getLastRowNum();   

       for(int rownum=0;rownum<=lastRowNo;rownum++){ 
       Row row; 
       if (sheet.getRow(rownum)!=null){ 
         row= sheet.getRow(rownum); 

         int lastCellNo=row.getLastCellNum(); 

          for(int cellnum=0;cellnum<lastCellNo;cellnum++){ 
            Cell cell; 
            if(row.getCell(cellnum)!=null){ 
            cell = row.getCell(cellnum); 
            if(Cell.CELL_TYPE_FORMULA==cell.getCellType()){ 
            evaluator.evaluateFormulaCell(cell); 
           } 
          } 
         } 
       } 
       } 


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