我的UI的一个元素是一个表格,其中显示了按类别汇总的项目列表,以及一些公式(请参阅下面的目标输出)。
允许用户将单元格绑定到类似电子表格的公式的最佳方法是什么?
到目前为止我设想的方法:
interface Formula { double calculate(); }
并在运行时生成,编译和加载实现 - 允许JIT编译生成的方法哪种方法更有意义?我还应该考虑其他任何解决方案或库吗?
示例
为了让目标更清晰,这是一个人为的例子 - 我们假设表中的项目是:
public class Item() {
public String category;
public String name;
public int quantity;
public double price;
}
目标输出
Category Name Quantity Price (avg) Value (sum)
All 82 1,090
Bikes 45 650
Bike 1 10 40 400
Bike 2 5 50 250
Cars 120 440
Car 1 3 100 300
Car 2 1 140 140
列配置
列可以这样定义:
Column # Formula
1 item.name;
2 item.quantity;
3 item.price;
4 Math.abs(column_2 * column_3); //calls a JDK method
汇总配置
汇总类别和汇总公式可以这样定义:
AGGREGATION #1: Category cat = item.category();
Column # Formula
1 cat;
2 "";
3 thisColumn.filter(cat).items().average(); //utility method
//this one is more complex
4 { double sum = 0;
for (double value : thisColumn.filter(cat).items())
sum += value;
return sum;
}
答案 0 :(得分:0)
我使用用户可以使用的自定义域特定语言,让ANTLR在java中生成一个本机解析器,将表达式解析为可执行函数。
参见例如http://arcanecoder.blogspot.be/2008/04/using-antlr-to-create-excel-like.html表示执行类似操作的示例,或http://www.antlr.org/wiki/display/ANTLR3/Expression+evaluator表示更近期的操作。
您可以定义'sum','average'等函数,并将其映射到自定义java代码,并使用例如$ 1或$ {name}让他们引用属性。
您只定义了您希望用户使用的那些功能,因此他们不能使用通用脚本语言中可用的任何有害功能。