有哪些工具可以将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
CELL NAMES
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。
答案 0 :(得分:4)
Apache POI项目提供的Java代码可以读取(主要是)Excel电子表格。
另一个项目Jacob为任意Windows程序的COM自动化提供了Java接口,当然包括Excel。您实际上是从外部使用Excel中的Excel API。
答案 1 :(得分:1)
JExcelApi允许您加载.xls文件并读取/写入单元格。
答案 2 :(得分:1)
我们与SmartXLS for java做了类似的项目。 它有一个运行时计算引擎和支持加载项公式。源工作簿转换为java类,可以嵌入到java程序中,并使用参数调用,就像在Excel中输入一样。
答案 3 :(得分:1)
另一个选项是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")));
}
}
(我在项目上工作,显然对任何反馈感兴趣)