我目前正在从事一个涉及 Excel 工作表分析的 Java 项目。该项目基于 Spring Boot 框架构建,利用 Apache POI 版本 5.2.4 进行 Excel Sheet 处理。
虽然应用程序通常运行良好,但我遇到了一些文件中出现以下错误的问题:“_xlfn.RANK.EQ。”
我尝试通过更改 Apache POI 版本来解决此问题,但不幸的是,这并没有成功。任何有关如何解决此问题的建议将不胜感激。
提前致谢!
Apache POI 中尚未实现 RANK.EQ 功能。
因此,您可以向 Apache POI 提交增强请求来实现它。或者您需要为尚不支持的功能实现您自己的 Java 代码。请参阅开发配方评估。
但似乎RANK.EQ
和
RANK
正在做完全相同的事情。并且
RANK
是在 Apache POI 中实现的。所以需要做的就是评估
RANK.EQ
与
RANK
相同。这可以通过将
RANK.EQ
实现为
org.apache.poi.ss.formula.functions.FreeRefFunction
来完成,它使用
org.apache.poi.ss.formula.functions.Rank
评估其参数。代码
EvaluateRankEQ.java
:
import java.io.FileInputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.formula.functions.FreeRefFunction;
import org.apache.poi.ss.formula.udf.AggregatingUDFFinder;
import org.apache.poi.ss.formula.udf.DefaultUDFFinder;
import org.apache.poi.ss.formula.udf.UDFFinder;
public class EvaluateRankEQ {
public static void main( String[] args ) throws Exception {
Workbook workbook = WorkbookFactory.create(new FileInputStream("./ExcelWithRankEQ.xlsx"));
String[] functionNames = { "_xlfn.Rank.EQ" } ;
FreeRefFunction[] functionImpls = { new RankEQ() } ;
UDFFinder udfs = new DefaultUDFFinder( functionNames, functionImpls ) ;
UDFFinder udfToolpack = new AggregatingUDFFinder( udfs ) ;
workbook.addToolPack(udfToolpack);
FormulaEvaluator formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator();
for (Sheet sheet: workbook) {
for (Row row : sheet) {
for (Cell cell : row) {
CellValue cellValue = formulaEvaluator.evaluate(cell);
System.out.println(cellValue);
}
}
}
workbook.close();
}
}
这是使用RankEQ.java
:
import org.apache.poi.ss.formula.OperationEvaluationContext;
import org.apache.poi.ss.formula.eval.ValueEval;
import org.apache.poi.ss.formula.eval.ErrorEval;
import org.apache.poi.ss.formula.functions.FreeRefFunction;
import org.apache.poi.ss.formula.functions.Rank;
public final class RankEQ implements FreeRefFunction {
@Override
public ValueEval evaluate( ValueEval[] args, OperationEvaluationContext ec ) {
if (args.length == 2) {
Rank rank = new Rank();
return rank.evaluate(ec.getRowIndex(), ec.getColumnIndex(), args[0], args[1]);
} else if (args.length == 3) {
Rank rank = new Rank();
return rank.evaluate(ec.getRowIndex(), ec.getColumnIndex(), args[0], args[1], args[2]);
}
return ErrorEval.VALUE_INVALID;
}
}