Apache POI 中的 RANK.EQ 函数出现问题

问题描述 投票:0回答:1

我目前正在从事一个涉及 Excel 工作表分析的 Java 项目。该项目基于 Spring Boot 框架构建,利用 Apache POI 版本 5.2.4 进行 Excel Sheet 处理。

虽然应用程序通常运行良好,但我遇到了一些文件中出现以下错误的问题:“_xlfn.RANK.EQ。”

我尝试通过更改 Apache POI 版本来解决此问题,但不幸的是,这并没有成功。任何有关如何解决此问题的建议将不胜感激。

提前致谢!

java excel apache-poi
1个回答
0
投票

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; } }
    
© www.soinside.com 2019 - 2024. All rights reserved.