行式 Excel 文件合并

 

1.  同构合并

在某个文件目录下有多个Excel文件,这些文件表头和列结构完全相同,只是数据行数和数据内容不同,需要将这些文件的数据全部合并到一个Excel文件中,共用同一个表头。

示例:在e:/orders目录下有每日的订单Excel文件,每个文件的结构相同,第一行是列名,第二行开始是数据,如下图所示,请将它们合并成一个订单表文件orders.xlsx

..

esProc SPL脚本如下:

A

1

=directory@p("e:/orders/*.xlsx")

2

=A1.conj(T(~))

3

=T("e:/orders.xlsx",A2)

A1   列出e:/orders目录中所有xlsx文件名,选项@p表示列出文件的全路径名

A2   读出A1中所有文件的数据并合并起来

A3   A2中合并后的数据写入文件orders.xlsx

 

2.  结构近似的合并

如果文件结构并不是完全相同,比如列的顺序不一样、列数不一样,但各文件都含有共同的几列,想要把这些共同列的数据都合并到一个文件中。合并这些文件时,需要按指定顺序读出每个文件中的这些共同列数据。

示例:还是上面这个例子,已知所有订单文件都有IDCompanyAreaOrderDateAmount5列,但各文件中列的顺序并不相同,有的文件还有其它一些列,请将各文件中的这5列数据合并到orders.xlsx文件中。

esProc SPL脚本如下:

A

1

=directory@p("e:/orders/*.xlsx")

2

=A1.conj(T(~;ID,Company,Area,OrderDate,Amount))

3

=T("e:/orders.xlsx",A2)

A1   列出e:/orders目录中所有xlsx文件名,选项@p表示列出文件的全路径名

A2   读出A1中所有文件中的ID,Company,Area,OrderDate,Amount5数据并合并起来

A3   A2中合并后的数据写入文件orders.xlsx

 

3.  文件名转成列数据

在合并数据的同时,需要为合并后的数据增加一列,并用合并前的文件名给此列赋值,以便标记数据类别或来源。

示例:在e:/orders目录下有各种零件的订单Excel文件,文件名就是零件的名字,比如tyre.xlsxengine.xlsx……等,各文件中数据结构与前例相同,请将它们合并成一个订单表文件orders.xlsx,并增加一列PartName用来记录零件的名字。

esProc SPL脚本如下:


A

1

=directory@p("e:/orders/*.xlsx")

2

=A1.conj((fn=filename@n(~),T(~).derive(fn:PartName)))

3

=T("e:/orders.xlsx",A2)

A1   列出e:/orders目录中所有xlsx文件名,选项@p表示列出文件的全路径名

A2   循环A1中所有文件,用filename函数得到当前文件的名字赋给变量fn,选项@n表示取得不带扩展名的文件名。用T函数读出当前文件的数据后增加一列PartName,列值为fn,并将所有文件数据合并起来。

A3   A2中合并后的数据写入文件orders.xlsx