首页 > 解决方案 > 如何在java中实现自定义的电子表格公式字段?

问题描述

我有一个要求,我需要根据一些 excel 公式字段获取值。在高层次上,我们有一个 Excel,用户可以自由输入日期值,并根据这些输入更新公式字段并计算总收入字段值。现在通过代码执行这些验证会更好

  1. 用 Java 为电子表格中的每个公式编写自己的实用程序。
  2. 使用 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 将是一个更好的解决方案。

标签: javaexceldate-difference

解决方案


我倾向于从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 月的最后一天。

关联

YEARFRAC 函数的文档


推荐阅读