启明办公

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 61|回复: 0

如何对两个 Excel 表实现各种类型的 JOIN

[复制链接]

3

主题

5

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2022-12-13 10:10:06 | 显示全部楼层 |阅读模式
某Excel中的sheet分为3类,其中sheet A是基础表,部分数据如下:
ABC
1interval1interval2interval3
21 hour1 day1 week
32 hours2 days2 weeks
43 hours3 days3 weeks
54 hours4 days4 weeks
Sheet B1\B2…Bn是关联表,它们的格式都一样,且与A有相同的列interval1、interval2、interval3。其中一个B的部分数据如下:
ABCDEFG
1interval1interval2interval3Typevalue1value2value3
22 hours1 day7 weekcircle37108.14.1
33 hours3 days7 weeksLine39117.54.2
44 hours4 days7 weeksLine351274.3
Sheet C用来描述A与B1\B2..Bn的Join类型,共3种,其中cross Join表示笛卡尔积;leftJoinBig表示左关联,关联列是interval1;leftJoinSmall也是左关联,关联列是interval1、interval2。部分数据如下:
AB
1tablejoinType
2B1crossJoin
3B2leftJoinBig
4B3leftJoinSmall
计算目标:按照sheet C中的join类型将sheet A和B1\B2..Bn关联起来,从A中取interva1列,从B取其他列,最后形成n个Excel文件。
以上面的sheet B为例(实际上每个B应当不同),如果joinType==crossJoin,则关联结果应该是:
ABCDEFG
1interval1interval2interval3Typevalue1value2value3
21 hour1 day7 weekCircle37108.14.1
31 hour3 days7 weeksLine39117.54.2
41 hour4 days7 weeksLine351274.3
52 hours1 day7 weekcircle37108.14.1
62 hours3 days7 weeksLine39117.54.2
72 hours4 days7 weeksLine351274.3
83 hours1 day7 weekcircle37108.14.1
93 hours3 days7 weeksLine39117.54.2
103 hours4 days7 weeksLine351274.3
114 hours1 day7 weekcircle37108.14.1
124 hours3 days7 weeksLine39117.54.2
134 hours4 days7 weeksLine351274.3
如果joinType==leftJoinBig,则关联结果应该是:
ABCDEFG
1interval1interval2interval3Typevalue1value2value3
21 hour
32 hours1 day7 weekcircle37108.14.1
43 hours3 days7 weeksline39117.54.2
54 hours4 days7 weeksline351274.3
如果joinType==leftJoinSmall,则关联结果应该是:
ABCDEFG
1interval1interval2interval3typevalue1value2value3
21 hour
32 hours
43 hours3 days7 weeksline39117.54.2
54 hours4 days7 weeksline351274.3
这个计算需要循环遍历sheet C,因此只能用脚本而不是公式来实现。Join属于结构化计算,VBA缺乏直接可用的函数,代码会非常繁琐。
实现步骤:
1. 运行集算器(可以到润乾官网下载,用职场版,首次运行时会提示加载授权,下载个免费的就够了)
2. 编写脚本并执行
AB
1=file("data.xlsx").xlsopen()
2=A1.xlsimport@t(;"C")
3=tableA=A1.xlsimport@t(;"A")
4for A2=tableB=A1.xlsimport@t(;A4.table)
5=case(A4.joinType,
"crossJoin",xjoin(tableA:A;tableB:B),
"leftJoinBig",xjoin@1 (tableA:A;tableB:B,A.interval1==interval1),
"leftJoinSmall",xjoin@1(tableA:A;tableB:B,A.interval1==interval1  && A.interval2==interval2))
6=B5.new(A.interval1,B.interval2,B.interval3,B.type,B.value1,B.value2,B.value3)
7=file(A4.table+A4.joinType+".xlsx").xlsexport@t(B6)
脚本函数 case 可对 Join 类型做分支判断,xjoin 算出笛卡尔积,@1 表示左关联。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|天恒办公

Copyright © 2001-2013 Comsenz Inc.Template by Comsenz Inc.All Rights Reserved.

Powered by Discuz!X3.4

快速回复 返回顶部 返回列表