多张 Excel 表格数据批量汇总—1 分钟搞定
在职场办公中,经常需要将多张表格中数据进行汇总求和,那么你知道怎么操作吗?
今天就来针对几种常见的情况,教大家一种高效的数据汇总方法,1分钟就能搞定。
第一种:数据来自多个Excel文件,汇总到一个新的Excel文件
第二种:数据来自同一个Excel的多个sheet页,插入汇总sheet页
首先我们需要用到一个叫esProc SPL的工具,这是一款专门处理结构化表格数据的软件,计算功能强大,使用简单。下载安装后双击即可安装。本文中的例题提供源代码,可复制粘贴使用。
第一种:数据来自多个Excel文件,汇总到一个新的Excel文件
(1)单个条件分组汇总
有多个Excel文件,每个文件的内容为几种水果产品每天的销量明细,现需要将几个月的数据汇总计算出每种水果的总销量。
汇总前:
汇总后:
首先把所有需要汇总的Excel文件都放到同一个文件夹下,例如都放到D盘名为test的文件夹。然后运行代码:
A |
|
1 |
=directory@p("D:/test/*.xlsx") |
2 |
=A1.conj(T(~)) |
3 |
=A2.groups(Product;sum(DailySales):TotalSales) |
4 |
=file("D:/test/Total.xlsx").xlsexport@t(A3) |
汇总完成!!!
解释下代码:
A1 directory有名址录的意思,这个函数在这里就表示列出test文件夹里所有.xlsx文件名目录
A2 循环打开A1路径里的文件,然后进行合并。
T()函数表示打开指定路径文件
A.()是循环函数,A1.(T(~))表示循环A1里的每一个文件路径,并用T()函数打开该文件,~符号表示每一次循环的对象。
循环打开所有文件后,我们还需要把它们合并到一起,因此再加一个conj()函数,表示conjunction的意思。
因此,A2单元里的代码A1.conj(T(~))就表示打开A1里的文件,然后进行合并成一个表格。
A3 根据产品Product分组,对每种产品销量求和,记为TotalSales
A4 将汇总数据保存为Total.xlsx文件
(2)多个条件分组汇总:
还是上述销售明细文件,需要按月汇总每种产品的销量,保存到一个新的Excel文件。
汇总后效果:
实现代码:
A |
|
1 |
=directory@p("D:/test/*.xlsx") |
2 |
=A1.conj((fn=filename@n(~),T(~).derive(fn:Month))) |
3 |
=A2.groups(Month,Product;sum(DailySales):MonthSales) |
4 |
=file("D:/test/MonthTotal.xlsx").xlsexport@t(A3) |
汇总完成!!!
代码解释:
A2 循环打开每个Excle文件,添加变量Month,取值为该数据来自的月份,然后合并多个文件。
A3 根据Month和Product分组汇总,得到每种水果产品的月销量
第二种:数据来自同一个Excel的多个sheet页,插入汇总sheet页
每种产品的销售明细存在同一个Excel文件的多个sheet页,需要生成一个汇总sheet页,得到每种产品的总销量。
汇总前:
汇总后:
实现代码:
A |
|
1 |
12 |
2 |
=A1.conj(T("D:/DailySales_2023.xlsx";~)) |
3 |
=A2.groups(Product;sum(DailySales):TotalSales) |
4 |
=file("D:/DailySales_2023.xlsx").xlsexport@kt(A3;"Total") |
汇总完成!!!
代码解释:
A1 输入要汇总的sheet页,比如第1到12页,即12个月的销售数据
A2 循环打开第1到12 sheet页,并合并成一个表格
A3 按照Product分组汇总,得到每种产品的总销量
借助SPL工具,多张表格数据汇总瞬间就能完成。
并且SPL的函数语法简单,符合自然逻辑思维,理解起来也不难。
当然SPL的功能不止于此,各种复杂场景的Excel文件操作SPL都不在话下。
有需要的小伙伴可以去查阅这本书esProc 桌面版与 Excel 处理,职场上90%的Excel问题都能在这本书中找到答案。书中的代码基本上复制过去,稍加改改就可使用。
大佬,早,谢谢你分享 spl 关于 excel 的操作技术!
但 xlsexport@at 这部分有点小小的问题:
第一次执行完语句之后,结果输出肯定是正常的,这点毋庸置疑。如果不小心又执行一次,或者在 excel 插件中使用时,多敲了几次回车,结果输出就会有问题了,Total 那个工作表里的数据就会重复 append 上去。能不能有一个方法可以改善这种输出,比如,当输出的目标工作表存在时,覆盖原来就存在的数据。@a 选项是少不了的,缺失选项 a 会把原有的工作表都删除,但有选项 a 时,结果就会 append,这里好像有点矛盾,不知道是不是我操作的姿势不对,恳请大佬有空时指点一下。
不要在插件里写文件吧,尤其不要用 @a 方式来写。Excel 里的公式,应该是执行多少次都不碍事的那种。写文件就是在 IDE 里去做了。
@a 不要求原文件存在,因为可能在循环中多次追加,如果必须要求原文件存在,那第一次写出时要 if 一下,不加 @a,这让代码很难看。这也是权衡后的结果。
你这种情况就别用 @a 了,每次都重写,虽然难看且耗时,但并不会错吧。
或者可以采用4.26 汇总文件 - 插入汇总 Sheet 页 - 乾学院 (raqsoft.com.cn)这种写法,写入到一个新的文件,然后把原始数据追加过去。
谢谢大佬回复。
就此帖中的案例而言,我并不认同您的观点。以下是我两毛钱的想法 (just my two cents):
1、针对这个案例,汇总之后的数据要写入当前工作簿下的 Total 工作表,其它的原始数据所在的工作表不能删除,相当于在原有基础上增加一个工作表来保存汇总结果,这也是报表的一种形式。xlsexport 在没有 @a 选项下输出时,当前工作簿下的原始数据所在的工作表都会被删除,相当于把原始数据给清除了,这样会有风险,让原始数据丢失。谁也不能保证所有的使用者都技术娴熟,误操作是难免的。不用 @a 选项不符合本案例的最终需求。
2、我的想法是,在输出时如果已经存在指定名称的工作表,可不可以清空该工作表之后再写入数据,或者删除该工作表后新增写入。
3、不同的人喜欢上某样东西的原因不尽相同。比如车,有些人只关注外观,只要符合她的审美,那老娘的车就是满大街上最靓的,有些人就关注发动机和车架,不能说哪个对,喜欢没有对错,消费者不同的需求罢了。就像您之前说的故事,农民伯伯用洗衣机洗地瓜,我觉得挺好,物尽其用。同样的,SPL 很牛,至少我认为 SPL 比微软的 Power Query 要强很多,IDE 很靠谱,但 SPL 吸引我的是 excel 插件。老板当初建议我学 SPL,我犹豫了个把月,看到了有插件我才提起了兴趣。当然,您这么大公司,自然有您的运筹,我个人的喜好影响不了您的考虑。我只是表达我的看法,SPL 以及他的插件是个好东西,若能进一步完善,自然是用户的福音。
有点扯远了,前两点望大佬得闲时考虑一下,看能不能改善。Thx in advance!
😄 谢谢。
但这是两个不同的场景。解题方法不只一种,来此并不是为了解题求结果,我求渔不求鱼。
xlsexport 好像是没办法单独覆盖一个 sheet 表,如果没有 @a 就全覆盖了。
所以,选项 @a 不写,是有风险的,万一头脑不清醒的时候来个误操作,直接在原始文件上输出,一键下去原始数据就没了。
或者语句执行之前有个提示也行,此操作将怎么样怎么样,让用户自己去选择。
像 4.26 汇总文件这个案例里的写法,蚂蚁搬家,in my humble opinion,不是很妥。
f.xlsexport 函数中已增加单独覆盖 sheet 功能及追加写入到 sheet 功能,可参考函数参考中 f.xlsexport 函数的 @k 与 @a 选项,更新下载贴中的 esproc-bin.jar 文件即可使用。
It works like magic!!!
谢谢大佬,大佬辛苦!!!
谢谢老贼,老贼威武雄壮!!!
谢谢 SPL,SPL 无敌!!!
谢谢各位,例题里的代码也已更新。
英文版
演示数据:
excel1zip