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 文件中,找出部门经理最年轻的部门。文件部分数据如下图所示:

QQ20210815164045png

QQ20210815163231png


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 查询的示例