将电子表格公式转换为java

哪些工具可用于将OpenOffice或Excel电子表格(及其所有公式)转换为可在运行时调用的Java对象?

显然,这只会使计算引擎成为数字和文本,而不是计时或API调用。

即使命名的单元格区域被用来(有效地)命名variables,输出代码也可能难以理解。 它需要重构才能更像普通的Java代码。 不过,我认为这对原型devise一些数据处理types的作业会很有帮助。 或者用于embedded由高级Excel用户维护的一些计算引擎。

编辑 :一个微不足道的例子:

出现

ABCD 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 

小区名称

  ABCD 1 Mortgage Value VALUE 2 Interest rate INTEREST 3 Type TYPE 4 Years YEARS 5 Regular payment REGPYMT 6 Total interest TOTALPYMT 

公式

  ABCD 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); } } 

我会假设单元格的固定types – java.math.BigDecimal或String。

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

  • 另一个项目Jacob提供了一个用于任意Windows程序的COM自动化的Java接口,当然还包括Excel。 你基本上是从外面使用Java的Excel的API。

JExcelApi允许您加载一个.xls文件并读/写单元格。

http://www.andykhan.com/jexcelapi/

我们已经为Java用SmartXLS做了一个类似的项目。 它有一个运行时计算引擎和支持插件公式。源工作簿被转换为一个java类,它可以embedded到java程序中,并使用参数调用,就像在Excel中input一样。

另外一个选项是Expr4J 。 它实现了与Excel兼容的通用expression式语言分析器,并具有用于计算expression式图的依赖引擎。 它还实现了Excel内置函数的大部分function。

从网站上,一个例子是:

 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"))); } } 

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