Power Query 案例 47:Excel里最让人头疼的堆叠报表,竟然用这几行代码就轻松解决了?


日常工作中,你一定遇到过这种 “一坨式” 报表:
院校、专业、人事、报表、导出数据……
明明是一体信息,却硬生生上下堆在一起, 不能筛选、不能汇总、不能透视,完全没法直接分析。
这种格式看着头疼,手动处理又很麻烦。
今天我们用Power Query (PQ),通过一个通用的清洗模板,一键将这种“非规范”的纵向数据,整理成标准的二维表!
需求
表格中记录了不同院校不同专业的志愿计划数,一个学校对应 N 个专业,总共数据有2000多条,院校的基本信息和专业信息都是纵向堆叠在一起。
需求是:
将院校的基本信息和专业信息横向拼在一起,整理成规范的二维表。
效果如下:
核心思路
我们要把这种**“纵向堆叠”变成“横向展开”**,核心思路只有5步:
-
按 “院校代号” 做局部分组,把每个学校切成独立子表 -
每个子表里:第一行是院校信息,下面是专业 -
用 List.TransformMany 做拼接:1 行院校 × N 行专业 -
封装函数,批量处理所有学校 -
合并所有子表,得到最终规范表
处理步骤
-
将数据导入PQ,注意不要勾选“表包含标题”

-
将数据分组。
不同的院校的数据,都是从院校代号开始,利用这个规律,用
Table.Group对【列1】进行局部分组
-
先随便拿一组数据,并提升下标题,先看下单组数据如何处理。


-
将子表数据转为List 先观察数据规律,确定处理思路是:把第一行数据,和后面每一行的专业数据,拼在一起,最后转表就行。 

-
数据拼接
用
List.TransformMany,对院校信息(第一行数据)和专业信息(第三行开始所有数据)进行笛卡尔积,将它们拼在一起。
-
转为表格,完成单个表格处理。

第二参数是构建了一个动态标题
-
把单个表的处理,封装成自定义函数
fx
-
回到主查询,调用自定义函数,完成批量处理。
如果不想用自定义函数,把上面单个表的过程,用
record的形式直接写在这里也可以。不过自定义函数会让代码看起来更清晰。
-
将子表深化出来,再合并在一起,就完成了数据的处理

最终代码
let 源 = Excel.CurrentWorkbook(){[Name="表3"]}[Content], 自定义1 = Table.Group( 源,"列1",{"a",each fx(_)},0,(x,y)=>Number.From( y="院校代号")), 自定义2 = Table.Combine( 自定义1[a])in 自定义2//自定义函数fx,复制下面代码,粘贴到高级编辑器,并改个名字:fx(t as table)=>let a1 = t, 提升的标题 = Table.PromoteHeaders(a1, [PromoteAllScalars=true]), lst = Table.ToList( 提升的标题,each _), 自定义2 = List.TransformMany( {lst{0}},each List.Skip( lst,2),(x,y)=>x&y), name = Table.ColumnNames(提升的标题)& lst{1}, 自定义3 = Table.FromRows(自定义2, name)in 自定义3
这个技巧是处理 “多层级堆叠报表” 的通解:
志愿填报、人事报表、财务汇总、多层级堆叠报表……
只要是 “头 + 体” 堆叠结构,都能用这套思路一键整理。
完整示例文件 + 可复用代码 已整理好,
后台回复关键词 F260413 自取。
如果你有任何数据处理方面的难题,也欢迎在评论区留言,我们一起交流。
💬 如需加群交流,后台回复 “进群” 或 加我微信:marchinks(备注进群)
完
Power Query 案例 46:用 “双层循环” 秒杀绩效波动难题
Power Query 案例 45:还在用VLOOKUP查BOM?递归3秒搞定无限层级反查!
Power Query 案例 44:告别繁琐公式!一键搞定跨时间段工时匹配统计
Power Query 案例 43:志愿 + 分数自动匹配,录取名单一键生成!
Power Query 案例 42:这种奇葩表格,谁做谁崩溃!教你个万能清洗模板


夜雨聆风