[英]Using Excel PERCENTILE function in Apache POI
我正在使用Apache POI 3.9,我需要使用Excel公式PERCENTILE並從Java內部評估該公式。
問題是不支持PERCENTILE。
我得到org.apache.poi.ss.formula.eval.NotImplementedException:
錯誤
我有3種可能的解決方案來解決我的問題。
用Java編寫自己的百分位數函數並將其貢獻給Apache POI庫(請參閱http://poi.apache.org/spreadsheet/eval-devguide.html )
將PERCENTILE轉換為SMALL函數,例如代替=PERCENTILE(A1:A10,95%)
然后=(SMALL(A1:A10,9)+SMALL(A1:A10,10))/2
此時,我需要一個快速的解決方案。 對我來說,第三個是最好的,但結果卻不盡相同。
在我退回到選項2有點混亂之前,是否有人有任何想法?
感謝Gagravarr的鼓勵,也感謝您的帖子Apache POI- 如何注冊一個非常有用的功能
我通過以下方式在庫中實現了PERCENTILE函數:
retval[328] = AggregateFunction.PERCENTILE;
到文件org.apache.poi.ss.formula.eval.FunctionEval.java public static final Function PERCENTILE = new Percentile();
放在適當位置的文件org.apache.poi.ss.formula.functions.AggregateFunction.java中。 我在同一文件中添加了以下代碼(我基於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); }
}
然后,我分別上載了這兩個文件,然后可以正常使用PERCENTILE函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.