java - 如何在java中实现自定义的电子表格公式字段?
问题描述
我有一个要求,我需要根据一些 excel 公式字段获取值。在高层次上,我们有一个 Excel,用户可以自由输入日期值,并根据这些输入更新公式字段并计算总收入字段值。现在通过代码执行这些验证会更好
- 用 Java 为电子表格中的每个公式编写自己的实用程序。
- 使用 Apache POI 在运行时在电子表格中输入值并评估公式以获得收入值。
在方法 1 中,我遇到以下问题:在为=YEARFRAC(B1, B2+1)*12
公式实现以下代码时
public static double calculateContractLength(String startdate,String enddate) {
double monthsBetween = ChronoUnit.MONTHS.between(
LocalDate.parse(startdate),
LocalDate.parse(enddate));
return monthsBetween;
}
我看到 excel 公式和上述代码的结果不匹配。对于实例开始日期 = 2/12/2020 结束日期 = 12/31/2022,我看到 excel 显示 34.63 但代码返回 34.0
为了更好地处理,我想知道是否有一些现有的库已经实现了这些电子表格公式,或者只是在运行时使用 Apache POI 更新 excel 将是一个更好的解决方案。
解决方案
我倾向于从yearfrac
函数的文档(底部的链接)中了解到,当给定两个参数(如您的示例中)时,它将在一个月内计算 30 天。我不知道是否要求您的 Java 代码完全相同。无论如何,这是我模仿的尝试:
public static double calculateContractLength(String startdate,String enddate) {
Period per = Period.between(
LocalDate.parse(startdate),
LocalDate.parse(enddate));
return per.toTotalMonths() + per.getDays() / 30.0;
}
使用您的问题中的示例日期进行尝试,预计为 34.63:
System.out.println(calculateContractLength("2020-02-12", "2022-12-31"));
输出是:
34.63333333333333
我还尝试了yearfrac
文档中示例中的日期:
System.out.println(calculateContractLength("2012-01-01", "2012-07-30"));
文档说结果是 0.58055556 年,所以应该是 0.58055556 * 12 个月 = 6.96666672 个月。我们得到:
6.966666666666667
在极端情况下可能仍然会有(更大的)差异。月份的分数没有明确定义。如果相同,则一个标志是 MS 文档指出:
当使用美国 (NASD) 30/360 基准时, YEARFRAC函数可能会返回不正确的结果,并且 start_date 是 2 月的最后一天。
关联
推荐阅读
- xcode - Xcode 12.0 调试时不显示变量
- javascript - 如何将状态变量传递给 React 中的函数?
- sql - 如何在以下 SQL 查询的输出中获得正确的名称?
- spring - 在 ResponseEntityExceptionHandler 中,handleExceptionInternal 和 handleException 之间的确切区别是什么?
- mysql - 如何在 Laravel 中使用子句进行链接
- python - 如何在自定义健身房环境中定义动作空间,每回合接收 3 个缩放器和一个矩阵?
- python-3.x - 尝试导入 cv2(opencv-python) 包时出错
- javascript - 我想为这个 jquery 创建循环
- python - ImportError:libopencv_ml.so.4.4:无法打开共享对象文件:没有这样的文件或目录
- python - 如何用大写和小写字母打印每个 8 字母字符串?(在蟒蛇中)