2011-04-19 226 views
8

我在我的工作表的單元格中有一些公式,我想在插入一些值後對它們進行評估。例:Apache POI評估公式

我的公式是=SUM(B1,B2)

之前值插入B1值爲1,和B2值爲3,以及公式結果是4

後的值的插入現在B1具有值5,和B2有價值2但公式仍然產生4,我該如何評估/觸發這個計算?

當然,當我按下公式單元格上的返回按鈕時,計算出新值7,有沒有辦法在沒有手動交互的情況下觸發?

我使用的是2007年Excel,以便XSSFWorkbook

編輯/ UPDATE:

我用Gabors的解決方案,他的貼吧,但我用它作爲參考之前,這裏是發生了什麼:

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) 
............... 
............... 

下面是相關的部分代碼:

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

實際調用評價:

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

我找人用這個,是成功的,而不是那些誰谷歌的解決方案沒有真正嘗試它,我一直在谷歌上搜索了很多,至少可以說。

每Gagravar建議,我有我的類路徑中的POI 2:

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

不過,我覺得我需要3.7版本XSSF工作簿等

SOLUTION:

<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指示我在您的類路徑中有兩個POI jar副本。確保你只有一個,那麼它應該工作正常 – Gagravarr 2011-04-19 13:18:36

+0

@Gagravarr請參閱我的更新 – ant 2011-04-19 13:28:42

+0

這是你的問題。您的POI版本需要匹配。對於主要POI罐子和poi-ooxml罐子,你都需要3.8-beta1(或者更好的3.8-beta2)。版本之間不能混用和匹配POI罐子! – Gagravarr 2011-04-19 13:38:39

回答

12

提升爲答案評論...

您首先需要確保您使用的POI相同版本的主缸,和OOXML的一部分。你的maven代碼片段顯示爲3.7,另一個顯示爲3.8 beta 1。你需要確保他們都是一樣的。 (你甚至可能想要使用3.8-beta2)。

然後,使用:

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

或:

XSSFFormulaEvaluator.evaluateAllFormulaCells(wb); 

,如果你使用HSSF嘗試見http://poi.apache.org/spreadsheet/eval.html更多細節

+2

這將有望幫助一些可憐的靈魂在那裏,謝謝 – ant 2011-04-19 13:53:32

+0

從2017年的問候:)謝謝你的答案!這正是我一直在尋找的:)在poi 3.17和'formulaEvaluator.evaluateInCell(cell);不推薦使用FYI'evaluateFormulaCell';而應該使用''。 – 2017-09-23 21:52:59

+0

@VladimirVagaytsev我認爲你錯了 - [evaluateFormulaCell](http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/FormulaEvaluator.html#evaluateFormulaCell-org.apache.poi.ss。 usermodel.Cell-)仍然未被棄用! 'evaluateInCell'做了一些不同的事情,它用eval的結果替換了公式 – Gagravarr 2017-09-27 15:00:15

3

也許XSSFFormulaEvaluator.evaluateAllFormulaCells(XSSFWorkbook wb)

(或者更具體地說:evaluateFormulaCell(Cell cell)

如果它不工作:您正在使用什麼版本的POI的? XSSF中的公式受v3.5支持。

此外,請嘗試使用XSSFCreationHelper實例化您的Formula Evaluator,如POI docs建議的那樣。

+0

請不要告訴我只是使用Google?你真的用過這個成功嗎? – ant 2011-04-19 13:16:19

+0

請參閱http://poi.apache.org/spreadsheet/eval.html - Gabor建議應該工作得很好。 – Gagravarr 2011-04-19 13:19:18

+0

@Gagravarr我已經做了,你有沒有用過這個成功? – ant 2011-04-19 13:20:58

0

HSSFFormulaEvaluator.evaluateAllFormulaCells(workbook); 
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); 
           } 
          } 
         } 
       } 
       } 


      }