集算器协助java处理多样性数据源之Excel

Java程序员读取和计算excel的程序一般要使用poi或其它开源包,这些开源包对编程的支持较为底层,整体学习成本和操作复杂度都很高。使用集算器辅助java处理excel文件就可以避免这些事务。

下面通过一个例子看一下具体作法:从Excel文件orders.xls中读取订单信息,找出201011日(含)之后,SELLERID等于18的订单。orders.xls的内容如下:

集算器协助java处理多样性数据源之Excel_第1张图片

实现的思路是:用Java程序调用集算器脚本,读取和计算excel文件中的数据,之后将结果以ResultSet的方式返回给Java程序。由于集算器支持动态表达式解析和求值,使得Java程序可以像使用sql那样,灵活的处理数据。

首先,程序员可以将条件201011日(含)之后,并且SELLERID等于18的订单。”作为参数where传递给esProc程序,如下图:

集算器协助java处理多样性数据源之Excel_第2张图片

where是个字串,其值为:ORDERDATE>=date(2010,1,1) && SELLERID==18。

esProc的程序代码如下:

集算器协助java处理多样性数据源之Excel_第3张图片

A1:定义一个file对象,导入excel数据。esProc的集成开发环境可以直观的显示出导入的数据,如上图右边部分。importxls函数也可以读写xlsx文件,它会根据文件扩展名自动判断excel的版本。

A2:按照条件过滤。这里使用宏来实现动态解析表达式,其中的where就是传入参数。集算器将先计算${…}里的表达式,将计算结果作为宏字符串值替换${…}之后解释执行。这个例子中最终执行的是:=A1.select(ORDERDATE>=date(2010,1,1) && SELLERID==18)

A3:将符合条件的结果集返回给java。如果需要将结果写入另外一个excel文件,只要将A3单元格改为:=file("D:/file/orders_result.xls").exportxls@t(A2)。

过滤条件发生变化时不用改变程序,只需改变where参数即可。例如,条件变为:201011日(含)之后,并且SELLERID等于18的订单,或者CLIENT等于PWQ的订单。Where的参数值可以写为:CLIENT=="PWQ"||ORDERDATE>=date(2010,1,1) && SELLERID==18。执行之后,A2中的结果集如下图:

集算器协助java处理多样性数据源之Excel_第4张图片

Java程序中使用esProc JDBC调用这段程序获得结果的代码如下:(将上述esProc程序保存为test.dfx):

//建立esProc jdbc连接

Class.forName("com.esproc.jdbc.InternalDriver");

con= DriverManager.getConnection("jdbc:esproc:local://");

//调用esProc程序(存储过程),其中testdfx的文件名

com.esproc.jdbc.InternalCStatement st =(com.esproc.jdbc.InternalCStatement)con.prepareCall("call test(?)");

//设置参数

st.setObject(1,"ORDERDATE>=date(2010,1,1) && SELLERID==18 || CLIENT==\"PWQ\""); //执行esProc存储过程

ResultSet set =st.executeQuery();

 

对于代码较简单的脚本,还可以把代码直接写在调用集算器JDBCJava程序中,而不必专门编写脚本文件(test.dfx):

ResultSet set = st.executeQuery(

"=file(\"D:/file/orders.xls\").importxls@t().select(ORDERDATE>=date(2010,1,1) && SELLERID==18 || CLIENT==\"PWQ\")");

这段Java代码直接调用了集算器的一句脚本:从Excel文件中取得数据,并按照指定的条件过滤。


你可能感兴趣的:(技术探讨)