java - Apache POI 支持多少个函数?以及这些缺失的功能

标签 java excel apache-poi

我正在处理一个使用具有非常复杂数学模型的电子表格的项目。
来自 Apache 官方文档,它列出了 302 supported functions as of July 2021 ,但是,如果我们调用 WorkbookEvaluator.getSupportedFunctionNames() ,只有202个。为什么有100个差异?特别是这些统计函数,如 NORMDIST、NORMINV 等?
如果有一个包含错过的 100 个函数的库,我在哪里可以找到它们?

最佳答案

在这种情况下,Apache POI 的文档有点不清楚。因此,我将尝试阐明更多信息。
首先:以下都是2022-01-26的状态,Apache poi 5.2.0 .
已实现或只知道名称的 Excel 函数
Developing Formula Evaluation -> What functions are supported?告诉:

As of July 2021, POI supports 302 built-in functions, see Appendix A for the full list.


但事实并非如此。最好是这样写:“POI 知道 393 个内置函数的名称。”,因为还没有实现所有这些函数。
  // list of functions that POI can evaluate
  java.util.Collection<String> supportedFuncs = org.apache.poi.ss.formula.WorkbookEvaluator.getSupportedFunctionNames();
  System.out.println("Following functions are implemented by Apache POI:");
  System.out.println("Count: " + supportedFuncs.size());
  System.out.println(supportedFuncs);
列出了 202 个实现的功能。
  // list of functions that are known but not supported by POI
  System.out.println("Following functions are known by name by Apache POI but not implemented yet:");
  java.util.Collection<String> unsupportedFuncs = org.apache.poi.ss.formula.WorkbookEvaluator.getNotSupportedFunctionNames();
  System.out.println("Count: " + unsupportedFuncs.size());
  System.out.println(unsupportedFuncs);
列出了 191 个名称已知但尚未实现的函数。
这 191 个函数缺少 Java 实现代码。他们的名字是众所周知的,但 WorkbookEvaluator将无法评估它们。所以org.apache.poi.ss.formula.eval.NotImplementedFunctionException将被抛出。
如何实现已知但未实现的功能?
Java 代码可以按照 Developing Formula Evaluation 中的描述实现。 .但还有一个障碍。
Developing Formula Evaluation -> Two base interfaces to start your implementation :

All Excel formula function classes implement either the org.apache.poi.hssf.record.formula.functions.Function or the org.apache.poi.hssf.record.formula.functions.FreeRefFunction interface. Function is a common interface for the functions defined in the Binary Excel File Format (BIFF8): these are "classic" Excel functions like SUM, COUNT, LOOKUP, etc. FreeRefFunction is a common interface for the functions from the Excel Analysis ToolPak, for User Defined Functions that you create, and for Excel built-in functions that have been defined since BIFF8 was defined.


因此,对于实现,需要知道这 191 个函数中的哪一个需要实现 org.apache.poi.hssf.record.formula.functions.Function以及其中哪些需要实现org.apache.poi.hssf.record.formula.functions.FreeRefFunction .
  // list of ATP functions that are known but not supported by POI
  System.out.println("Following functions are ATP functions known by name by Apache POI but not implemented yet:");
  java.util.Collection<String> unsupportedFuncsATP = org.apache.poi.ss.formula.atp.AnalysisToolPak.getNotSupportedFunctionNames();
  System.out.println("Count: " + unsupportedFuncsATP.size());
  System.out.println(unsupportedFuncsATP); 
列出了 的 83 个函数一个 分析电话 电话 ak 名称已知但尚未实现的函数。对于那些实现需要实现org.apache.poi.hssf.record.formula.functions.FreeRefFunction .
  // list of BIFF8 functions that are known but not supported by POI
  System.out.println("Following functions are BIFF8 functions known by name by Apache POI but not implemented yet:");
  java.util.List<String> unsupportedFuncsBIFF8 = unsupportedFuncs.stream().filter(n -> !unsupportedFuncsATP.contains(n)).collect(java.util.stream.Collectors.toList());
  System.out.println("Count: " + unsupportedFuncsBIFF8.size());
  System.out.println(unsupportedFuncsBIFF8);  
列出了 108 个函数,它们是名称已知但尚未实现的“经典”Excel 函数。对于那些实现需要实现org.apache.poi.hssf.record.formula.functions.Function .
那些列表之外的 Excel 函数呢?
既未实现也不知道名称的 Excel 函数必须作为用户定义的函数实现。这在 User Defined Functions 中有描述。 .这基本上是为了实现用户定义的函数,这些函数在 VBA 或加载项中。但它也可用于实现新的 Excel 函数,这些函数在 Apache POI 中甚至不知道名称。我已经展示了一个实现 NUMBERVALUE 的示例功能。
为什么需要实现 Java 功能代码?
Apache POI 的方法是无需安装 Microsoft Office 应用程序即可处理 Microsoft Office 文件。因此 Apache POI 无法访问已实现的 Excel 函数,因为没有 Excel 应用程序。所以所有需要的功能都需要通过自己的代码来实现。
这里的主要问题是单个 Excel 函数的源代码是封闭源代码,因此不公开。唯一的可能是根据发布的功能描述来实现代码。这通常会导致 Java 实现的函数代码和 Excel 函数代码的结果之间存在差异。该问题在函数的边界用例中增加。例如,如果省略参数或使用非预期类型设置参数。因此,如果 Apache POI 的公式评估结果与 Microsoft Excel 的不同,请不要感到惊讶。

关于java - Apache POI 支持多少个函数?以及这些缺失的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70855089/

相关文章:

java - Selenium 独立启动 Firefox,它保持空白

java | Apache POI |如何在不创建行的情况下避免空指针异常

jasper-reports - Jasper报告Excel切断单元格

java - 将 LocalDateTime 转换为时间戳格式

java - 以编程方式截取屏幕截图

java - 如何使用 POI 链接 Excel 文件中的图像

arrays - 将字符串从数组传递给函数的类型不匹配错误(在 VBA 中)

org.apache.poi.xssf.usermodel.XSSFCell 中 java 中的 Java Excel 数据上传错误

java - 异常 org.apache.poi.poifs.filesystem.OfficeXmlFileException - apache.Poi 4.0.0

java - 如何在 JavaFx 8 中将鼠标坐标转换为本地 SubScene