大多数JAVA程序猿都选择使用POI或者HSSFWorkbook等第三方类库来实现Excel自动化合并,这样一来不仅需要噼里啪啦的敲好多代码,费事费力,而且用起来灵活度也不高,对Excel的格式要求也很严格。如果能有一个专用的外部数据工具,写简单类似SQL的脚本来实现,然后在JAVA中直接调用并返回结果集,就再好不过了。润乾集算器就是这样的机制,通过使用JDBC调用SPL脚本,使用起来方便快捷,下面就来学习下具体如何使用。
SPL实现
常规合并:
A. 同一个 excel 中的多个Sheet表合并
下面的例子是一个包含了销售数据的 excel 文件,其中包含了按月划分的 3 个结构相同的 sheet 工作表,数据如下:
January_2013:
February_2013:
March_2013:
在合并3个Sheet的同时,我们还可以同时从每个sheet中筛选出字段Customer Name, Sale Amount。最后的效果如下:
SPL 脚本:
A |
|
1 |
=file(”D:/sales_2013.xlsx”).xlsopen() |
2 |
=A1.conj(A1.xlsimport@t('Customer Name','Sale Amount';~.stname)) |
3 |
>file(“D:/result_2013.xlsx”). xlsexport@t(A2;"merge_sheets") |
保存脚本文件oneExcel.dfx(嵌入Java会用到)
脚本说明:
A1: 打开指定的 excel 文件,创建一个由多个 sheet 工作表组成的序列。
A2:利用 conj 函数遍历 A1 序列中所有的成员工作表,导入每个工作表中指定列'Customer Name','Sale Amount',并将数据并合并。其中 xlsimport 函数导入指定列,最后一列用分号; 隔开。 参数~.stname表示指定当前工作表,由于在 conj 函数的循环中,所以就可以逐个导入所有工作表。同时,xlsimport 使用选项@t指明将工作表的第一行记录作为字段名。
A3: 将序表 A2 作为一个新的工作表“merge_sheets”保存到原来的 excel 文件中,同样用选项 @t 指明首行记录为标题。
这段脚本只有三句话,短小精干之余,逻辑清晰,也比较容易理解。下面我们再看看如何合并多个文件中的多个工作表。
B. 不同 excel 中的多表合并
下面是要合并的多个 excel 文件,它们都具有和上面例子相同的表结构,每个文件记录了当年的数据:
SPL 脚本:
A |
B |
|
1 |
for directory@p(”d:/excel/*.xlsx“) |
=file(A1).xlsopen() |
2 |
=B1.conj(B1.xlsimport@t('Customer Name','Sale Amount','Purchase Date';~.stname)) |
|
3 |
=@|B2 |
|
4 |
>file(“d:/result.xlsx”). xlsexport@t(B3;"merge_data") |
合并后的结果如下:
保存脚本文件MergeExcels.dfx(嵌入Java会用到)
脚本说明:
A1: 通过 for 循环,遍历指定目录下的 excel 文件,在 B1 到 B3 之间进行循环内处理。
B1:打开目录下的一个 excel 文件,生成序列。
B2:导入当前文件中的每个 sheet 工作表中指定列'Customer Name','Sale Amount','Purchase Date'的数据,然后合并这些数据,与前面例子中的 A2 类似。
B3:将序表 B2 的数据与 @表示的本网格的值进行合并。
A4:将序表 B3 保存到result.xlsx文件中的 merge_data 工作表中。
上面程序用两个循环就实现了多个 excel 文件数据合并,外循环 for 遍历了目录下所有的 excel 文件,内循环B1.conj则合并每个excel文件中的多个sheet工作表的数据。
C.