如何在java中实现自定义的电子表格公式字段?

vlf7wbxs  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(377)

我有一个要求,我需要得到一些excel公式字段的基础上的值。在较高的层次上,我们有一个excel,用户可以自由地输入日期值,并根据这些输入更新公式字段和计算总收入字段值。现在要通过代码执行这些验证
用java为电子表格中的每个公式编写自己的实用程序。
在运行时使用apachepoi在电子表格中输入值,并计算公式以获得收入值。
关于方法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公式和以上代码的结果不匹配。例如,start date=2/12/2020 end date=12/31/2022,我看到excel显示34.63,但代码返回34.0
为了更好地处理,我想知道是否有一些现有的库已经实现了这些电子表格公式,或者只是在运行时用apachepoi更新excel会是一个更好的解决方案。

ibps3vxo

ibps3vxo1#

我倾向于从文件中了解 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.966672个月。我们得到:
6.966666666666667
在角落的情况下,可能还会有(稍微大一点的)差别。月份的分数没有很好的定义。ms文档中有一个标志(如果相同):
使用us(nasd)30/360基准时,yearfrac函数可能返回不正确的结果,并且开始日期是2月份的最后一天。

链接

yearfrac函数的文档

相关问题