Java 有没有能在 Excel 文件上执行 SQL 的开源类库?
Java 程序读取 Excel 文件中的数据通常是用开源包 Apache POI,POI 虽然强大,但是有一定的学习曲线,对于格式比较规整的 Excel 文件,如果能把 Excel 表作为 java 的数据库,利用 SQL 来计算数据,会十分便捷。Open-esProc 就是这种类型的开源包,是全方位专业的处理结构化数据为目标的计算包,将用 SQL 计算方法也封装到了执行 Open-esProc 计算功能的 SPL 脚本语言中,在 Java 程序中调用 SPL 脚本,返回 ResultSet 对象。例如下面这个 info.xlsx 文件:
如果要查询出男员工信息,编写 SPL 脚本如下:
A | |
---|---|
1 | =connect() |
2 | =A1.query(“select * from d:/excel/info.xlsx where Sex=’M’”) |
这段代码可在esProc IDE中调试/执行,然后将其存为脚本文件(比如condition.dfx),通过JDBC接口在JAVA中调用,具体代码如下:
package Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class test1 {
public static void main(String[] args)throws Exception {
Class.forName("com.esproc.jdbc.InternalDriver");
Connection connection =DriverManager.getConnection("jdbc:esproc:local://");
Statement statement = connection.createStatement();
ResultSet result = statement.executeQuery("call condition()");
printResult(result);
if(connection != null) connection.close();
}
…
}
上面的用法类似存储过程,其实SPL也支持类似SQL的用法,即无须脚本文件,直接将SPL script 嵌入JAVA,代码如下:
…
ResultSet result = statement.executeQuery("
=connect().query(\“select * from d:/excel/info.xlsx where Sex=’M’\”)");
…
SPL 支持 SQL92 标准中的大部分语法,比如支持复杂 SQL 作为子查询。
示例:员工信息和部门信息分别存储在两个 Excel 文件中,找出部门经理最年轻的部门。文件部分数据如下图所示:
A |
|
1 |
$select emp.BIRTHDAY as BIRTHDAY,emp.DEPT as DEPT from E:/data/DEPARTMENT.xlsx as dept join E:/data/EMPLOYEE.xlsx emp on dept.MANAGER=emp.EID where emp.BIRTHDAY=(select max(BIRTHDAY) from ( select emp1.BIRTHDAY as BIRTHDAY from E:/data/DEPARTMENT.xlsx as dept1 join E:/data/EMPLOYEE.xlsx as emp1 on dept1.MANAGER=emp1.EID ) ) |
了解更多 SPL 中的 SQL 示例,可以参考 在文件上使用 SQL 查询的示例