2013-10-22 77 views
1

我已經通過這裏發佈了許多問題並提及了POI文檔,但我無法解決此問題。Apache POI:計算公式時出現異常

問題:當試圖重新計算公式時,我收到一個異常。

公式:

=CONCATENATE("#DFLT=",COUNTIF(C5:C390,"=DEFAULTERS"),"; #NP=",COUNTIF(C5:C390,"=NOT PAID"),"; #PCsh=",COUNTIF(C5:C390,"=Paid Cash"),"; #PChk=",COUNTIF(C5:C390,"=Paid Cheque"),"; #PNeft=",COUNTIF(C5:C390,"=Paid Neft")) 

例外:

10-22 17:13:15.177: E/AndroidRuntime(26300): FATAL EXCEPTION: main 
10-22 17:13:15.177: E/AndroidRuntime(26300): java.lang.IllegalArgumentException: Unexpected eval class (org.apache.poi.ss.formula.eval.MissingArgEval) 
10-22 17:13:15.177: E/AndroidRuntime(26300): at org.apache.poi.ss.formula.eval.OperandResolver.coerceValueToString(OperandResolver.java:275) 
10-22 17:13:15.177: E/AndroidRuntime(26300): at org.apache.poi.ss.formula.functions.TextFunction.evaluateStringArg(TextFunction.java:40) 
10-22 17:13:15.177: E/AndroidRuntime(26300): at org.apache.poi.ss.formula.functions.TextFunction$8.evaluate(TextFunction.java:249) 
10-22 17:13:15.177: E/AndroidRuntime(26300): at org.apache.poi.ss.formula.OperationEvaluatorFactory.evaluate(OperationEvaluatorFactory.java:132) 
10-22 17:13:15.177: E/AndroidRuntime(26300): at org.apache.poi.ss.formula.WorkbookEvaluator.evaluateFormula(WorkbookEvaluator.java:525) 
10-22 17:13:15.177: E/AndroidRuntime(26300): at org.apache.poi.ss.formula.WorkbookEvaluator.evaluateAny(WorkbookEvaluator.java:288) 
10-22 17:13:15.177: E/AndroidRuntime(26300): at org.apache.poi.ss.formula.WorkbookEvaluator.evaluateReference(WorkbookEvaluator.java:702) 
10-22 17:13:15.177: E/AndroidRuntime(26300): at org.apache.poi.ss.formula.SheetRefEvaluator.getEvalForCell(SheetRefEvaluator.java:51) 
10-22 17:13:15.177: E/AndroidRuntime(26300): at org.apache.poi.ss.formula.LazyAreaEval.getRelativeValue(LazyAreaEval.java:51) 
10-22 17:13:15.177: E/AndroidRuntime(26300): at org.apache.poi.ss.formula.eval.AreaEvalBase.getValue(AreaEvalBase.java:109) 
10-22 17:13:15.177: E/AndroidRuntime(26300): at org.apache.poi.ss.formula.functions.CountUtils.countMatchingCellsInArea(CountUtils.java:55) 
10-22 17:13:15.177: E/AndroidRuntime(26300): at org.apache.poi.ss.formula.functions.Countif.countMatchingCellsInArea(Countif.java:452) 
10-22 17:13:15.177: E/AndroidRuntime(26300): at org.apache.poi.ss.formula.functions.Countif.evaluate(Countif.java:441) 
10-22 17:13:15.177: E/AndroidRuntime(26300): at org.apache.poi.ss.formula.functions.Fixed2ArgFunction.evaluate(Fixed2ArgFunction.java:33) 
10-22 17:13:15.177: E/AndroidRuntime(26300): at org.apache.poi.ss.formula.OperationEvaluatorFactory.evaluate(OperationEvaluatorFactory.java:132) 
10-22 17:13:15.177: E/AndroidRuntime(26300): at org.apache.poi.ss.formula.WorkbookEvaluator.evaluateFormula(WorkbookEvaluator.java:525) 
10-22 17:13:15.177: E/AndroidRuntime(26300): at org.apache.poi.ss.formula.WorkbookEvaluator.evaluateAny(WorkbookEvaluator.java:288) 
10-22 17:13:15.177: E/AndroidRuntime(26300): at org.apache.poi.ss.formula.WorkbookEvaluator.evaluate(WorkbookEvaluator.java:230) 
10-22 17:13:15.177: E/AndroidRuntime(26300): at org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator.evaluateFormulaCellValue(HSSFFormulaEvaluator.java:354) 
10-22 17:13:15.177: E/AndroidRuntime(26300): at org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator.evaluate(HSSFFormulaEvaluator.java:185) 
10-22 17:13:15.177: E/AndroidRuntime(26300): at com.android.impressico.readupdateexcelfile.ExcelFileWriter.writeCellToFile(ExcelFileWriter.java:121) 

我提出以下嘗試重新計算公式:

  1. // ExcelFile.workbook.getCreationHelper()createFormulaEvaluator ().evaluateAll();

  2. // HSSFFormulaEvaluator.evaluateAllFormulaCells(ExcelFile.workbook);

  3. 爲(行r:片){ (電池C:R){ 如果(c.getCellType()== Cell.CELL_TYPE_FORMULA){ 的System.out.println(「評估公式用於細胞= 「+ c.getCellFormula()); evaluateator.setDebugEvaluationOutputForNextEval(true); evaluateator.evaluate(c);

回答

3

使POI日誌後我發現電池上

=CONCATENATE("#DFLT=",COUNTIF(C5:C390,"=DEFAULTERS"),"; #NP=",COUNTIF(C5:C390,"=NOT PAID"),"; #PCsh=",COUNTIF(C5:C390,"=Paid Cash"),"; #PChk=",COUNTIF(C5:C390,"=Paid Cheque"),"; #PNeft=",COUNTIF(C5:C390,"=Paid Neft")) 

依賴,是也擅長公式。

=CONCATENATE(" {",HZ5," - ",IA5,"}, ","{",IB5,,"}") 

這個公式有一個額外的逗號(,),這是引起MissingArgument在解析公式,同時評估IllegalArgumentException異常這個缺少的參數結果。

POI日誌顯示:

10-30 16:56:18.377: I/System.out(26511): [POI.FormulaEval]I  * ptg 7: org.apache.poi.ss.formula.ptg.MissingArgPtg [ ] 
10-30 16:56:18.377: I/System.out(26511): [POI.FormulaEval]I   = [email protected] 
0

POI現在可以評估其適用的範圍內操作員區裁判公式。

但是,POI仍然不能解析這些公式。例如,這些調用將失敗:

cell.setCellFormula("AVERAGE(J6:OFFSET(I6,0,DAY(TODAY())-1))"); 
cell.setCellFormula("SUM((C1:D2):(D2:E3))"); 

請參閱本link定爲同一

+0

我只評價公式,公式的設置僅在Excel中完成。我的目標是隻重新計算價值。請你詳細說明,爲什麼會發生這種異常,以便我可以嘗試處理是否正確。 – guptakvgaurav