簡體   English   中英

在Apache POI中使用Excel PERCENTILE函數

[英]Using Excel PERCENTILE function in Apache POI

我正在使用Apache POI 3.9,我需要使用Excel公式PERCENTILE並從Java內部評估該公式。

問題是不支持PERCENTILE。

我得到org.apache.poi.ss.formula.eval.NotImplementedException:錯誤

我有3種可能的解決方案來解決我的問題。

  1. 用Java編寫自己的百分位數函數並將其貢獻給Apache POI庫(請參閱http://poi.apache.org/spreadsheet/eval-devguide.html

  2. 將Excel工作表中的相關單元格放入Java中,並使用諸如百分位數計算中的函數之類的函數進行計算

  3. 將PERCENTILE轉換為SMALL函數,例如代替=PERCENTILE(A1:A10,95%)然后=(SMALL(A1:A10,9)+SMALL(A1:A10,10))/2

此時,我需要一個快速的解決方案。 對我來說,第三個是最好的,但結果卻不盡相同。

在我退回到選項2有點混亂之前,是否有人有任何想法?

感謝Gagravarr的鼓勵,也感謝您的帖子Apache POI- 如何注冊一個非常有用的功能

我通過以下方式在庫中實現了PERCENTILE函數:

  1. 我下載了Apache POI 3.9的源代碼
  2. 我在src / resources / main / org / apache / poi / ss / formula / function / functionMetadata.txt( 或在線 )中檢查了PERCENTILE函數的ID號,它是328
  3. 因此,我添加了retval[328] = AggregateFunction.PERCENTILE; 到文件org.apache.poi.ss.formula.eval.FunctionEval.java
  4. 我添加了public static final Function PERCENTILE = new Percentile(); 放在適當位置的文件org.apache.poi.ss.formula.functions.AggregateFunction.java中。
  5. 我在同一文件中添加了以下代碼(我基於LargeSmall函數;我一直在尋找與我想做的最相似的現有代碼/函數類型)

     private static final class Percentile extends Fixed2ArgFunction { protected Percentile() { } public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1) { double dn; try { ValueEval ve1 = OperandResolver.getSingleValue(arg1, srcRowIndex, srcColumnIndex); dn = OperandResolver.coerceValueToDouble(ve1); } catch (EvaluationException e1) { // all errors in the second arg translate to #VALUE! return ErrorEval.VALUE_INVALID; } if (dn < 0 || dn > 1) { // has to be percentage return ErrorEval.NUM_ERROR; } double result; try { double[] ds = ValueCollector.collectValues(arg0); int N = ds.length; double n = (N - 1) * dn + 1; if (n == 1d) { result = StatsLib.kthSmallest(ds, 1); } else if (n == N) { result = StatsLib.kthLargest(ds, 1); } else { int k = (int) n; double d = n - k; result = StatsLib.kthSmallest(ds, k) + d * (StatsLib.kthSmallest(ds, k + 1) - StatsLib.kthSmallest(ds, k)); } NumericFunction.checkValue(result); } catch (EvaluationException e) { return e.getErrorEval(); } return new NumberEval(result); } 

    }

  6. 然后,我分別上載了這兩個文件,然后可以正常使用PERCENTILE函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM