将电子表格公式转换为Java

4
有哪些工具可以将OpenOffice或Excel电子表格(包括其所有公式)转换为可在运行时调用的Java对象?
显然,这只会生成一个计算引擎,仅涉及数字和文本,而不涉及时间或API调用。
即使使用命名单元格范围来(有效地)命名变量,输出代码也可能很难理解。它需要重构以更像普通的Java代码。但是,我认为它对于原型设计某些数据处理类型的工作或嵌入由高级Excel用户维护的一些计算引擎将非常有用。
编辑:一个微不足道的例子:
外观
        A               B               C               D
1       Mortgage Value  100,000.00
2       Interest rate   4.5%
3       Type            Interest-only
4       Years           3
5       Regular payment 4,500.00
6       Total interest  13,500.00

单元格名称
        A               B               C               D
1       Mortgage Value  VALUE
2       Interest rate   INTEREST
3       Type            TYPE
4       Years           YEARS
5       Regular payment REGPYMT
6       Total interest  TOTALPYMT

公式

        A               B               C               D
1       Mortgage Value  100,000.00
2       Interest rate   4.5%
3       Type            Interest-only
4       Years           3
5       Regular payment =VALUE*INTEREST
6       Total interest  =YEARS*REGPYMT

将其翻译成Java可能会变成:

package example.calcengine;
import java.math.*;
public class MyCalcEngine {

    // unnamed cells
    public String A1 = "Mortgage Value";
    public String A2 = "Interest rate";
    public String A3 = "Type";
    public String A4 = "Years";
    public String A5 = "Regular payment";
    public String A6 = "Total interest";

    // named cells
    public BigDecimal VALUE = new BigDecimal(100000.00);
    public BigDecimal INTEREST = new BigDecimal(0.045);
    public String TYPE = "Interest-only";
    public BigDecimal YEARS = new BigDecimal(3);
    public BigDecimal REGPYMT = new BigDecimal(0);
    public BigDecimal TOTALPYMT = new BigDecimal(0);

    // formulas
    public void calculate() {
      REGPYMT = VALUE.multiply(INTEREST);
      TOTALPYMT = REGPYMT.multiply(YEARS);
    }
}

我会假设单元格的类型为固定类型 - 无论是java.math.BigDecimal还是String。


请添加一个示例,展示源电子表格和您期望生成的代码。 - Thorbjørn Ravn Andersen
单元格命名是Excel的标准功能。我在示例中使用BigDecimal来减少舍入问题(特别是货币计算)。 - martinr
显然,上述代码生成示例存在一个根本性的缺点,即它不使用Java类中的二维数组来表示工作表。为了支持求和、匹配、查找或引用单元格范围等操作,它需要这样做(并通过getter和setter隐藏命名单元格访问)。 - martinr
4个回答

5
  • Apache POI 项目提供了 Java 代码,可以读取(大部分)Excel 电子表格。

  • Jacob 是另一个项目,提供了一个 Java 接口,用于 COM 自动化任意 Windows 程序,当然包括 Excel。您在 Java 中从外部使用 Excel 的 API。


我注意到POI执行一些基本的公式计算,并支持通过插件方式扩展POI以添加更高级的公式支持。这非常完美。谢谢。 - martinr

2

还有一个选择是 Expr4J。它实现了一个通用表达式语言解析器,与 Excel 兼容,并具有计算表达式图的依赖引擎。它还实现了绝大部分 Excel 内置函数。

从网站上可以看到一个示例:

public class DependencyExample
{
    public static void main(String[] args) throws Exception {
        DependencyEngine e = new DependencyEngine(new BasicEngineProvider());
        e.set("B1", "=A1*2");
        e.set("A1", "=12*2");
        e.set("C1", "=B1*A1");
        System.out.println(e.getValue(Range.valueOf("B1")));
        System.out.println(e.getValue(Range.valueOf("C1")));
        e.set("A1", "2");
        System.out.println(e.getValue(Range.valueOf("B1")));
        System.out.println(e.getValue(Range.valueOf("C1")));
    }
}

(我在这个项目上工作,所以显然对任何反馈都会感兴趣)



这个项目的进展如何?源代码托管在哪里? - Suminda Sirinath S. Dharmasena

1

1
我们之前使用过SmartXLS for java完成了一个类似的项目。它具有运行时计算引擎和支持插件公式的功能。源工作簿被转换为Java类,可以嵌入Java程序中,并像在Excel中输入参数一样进行调用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接