将多个结构相同的工作表合并为一个工作表

例题描述和简单分析

在 xlsx 目录下有多个 Excel 文件(工作表),每个工作表有多个 sheet 页,但所有的 Excel 文件(工作表)结构相同,如下:

book1.xlsx—sheet1:

id

name

1

Jack

2

Tom

3

Jerry

book1.xlsx—sheet2:

id1

name1

10

Frank

11

Lucy

12

Alice

book2.xlsx—sheet1:

id

name

4

James

5

Danny

6

Lion

book2.xlsx—sheet2:

id1

name1

13

Terry

14

May

15

test

需要将这些 Excel 文件(工作表)合并为一个 Excel 文件(工作表),如下:

result.xlsx—sheet1

id

name

1

Jack

2

Tom

3

Jerry

4

James

5

Danny

6

Lion

result.xlsx—sheet2

id1

name1

10

Frank

11

Lucy

12

Alice

13

Terry

14

May

15

test

解法及简要说明

在集算器中编写脚本 p1.dfx,如下所示:


A

B

C

D

1

=directory@p("xlsx/")

2

for   A1

=file(A2).xlsopen()

3


for   B2

=file(A2).xlsimport@t(;B3.stname)

4



if   #A2==1

=file("result.xlsx").xlsexport@at(C3;B3.stname)

5



else

=file("result.xlsx").xlsexport@a(C3;B3.stname)

简要说明:

A1  读取xlsx路径下的所有文件名

A2  循环 A1

B2  返回 A2 文件名对应的工作表的 stname(sheet 页名),nrows(行数),ncols(列数)三个属性

B3  循环 B2

C3  读取 A2 文件名对应的工作表的 B3.stname 的 sheet 页内容

C4、D4  若 A2 的循环次数为 1,则将 C3 的内容导出至 result.xlsx 的 B3.stname 的 sheet 页中。@t 表示导出时包含表头,@a 表示追加方式导出

C5、D5  若 A2 的循环次数不为 1,则将 C3 的内容导出至 result.xlsx 的 B3.stname 的 sheet 页中。@a 表示追加方式导出

JAVA 集成这段代码的方法可参考:《Java 如何调用 SPL 脚本》

问答搜集

https://stackoverflow.com/questions/61788329/skipping-the-first-row-in-subsequent-worksheets-using-java-poi-that-are-being-co