PowerQuery 汇总系列 数据源标题不在第一行
数据字段标题是从第5行开始。应对不同的工作表数量时,采取的方法也不尽相同。
文章目录
文章难免有疏漏,若发现某处编辑有误,可评论留言。
相关问题也可找作者进行咨询,DIY定制皆可。
-
Authors
- @ 樊笼星海
- @ w180361
- @ Email:ou251@outlook.com
在汇总数据的时候,发现我们需要的数据并不是从第一行开始,假如数据字段标题是从第5行开始。
那么这种情况下,Excel.Workbook在修改第二参数后,还能正确的识别到标题吗?
1. 此节将涉及到的内容
- 转置,表格的行、列取值
- 将单个复杂的操作逻辑应用到多个需要重复的操作逻辑上
- 将自动生成的公式转换为自定义函数
- 应用自定义函数
2. 标题不在第一行
2.1 是否能够正确识别?
源数据:数据字段标题从第5行开始
-
使用PowerQuery获取此工作表数据,在不修改任何M公式的情况下,能够识别到标题。
![[图片]](https://i-blog.csdnimg.cn/direct/cac29fa4e07d481da31849bf22cb219d.png)
-
修改
Excel.Workbook的第二参数,能够识别到标题![[图片]](https://i-blog.csdnimg.cn/direct/fdef3b8725834ba28630f18d3f316415.png)
-
可以看到的是,即使数据字段标题从第5行开始,PowerQuery依然能够识别到数据是从哪一行开始的,这是因为工作表中的有效数据是从第5行开始。
但如果工作表中第1行至4行中任意一个单元格有空格,那就会出现问题。好在这种问题并不常见,如果出现,那就是做表人的锅。
![[图片]](https://i-blog.csdnimg.cn/direct/20251ef9e5c44331bee3089cc9001268.png)
2.2 跳过不需要的行(删除最前面几行)
-
直接使用PowerQuery提供的功能:删除最前面几行。
![[图片]](https://i-blog.csdnimg.cn/direct/bd2df19eec3b4bf4acbb6f80229707dc.png)
-
删除结果:到这里可以将第一行提升为标题
![[图片]](https://i-blog.csdnimg.cn/direct/43a90bd2fab94a3db4e728f45dcd16af.png)
-
这里自动生成的函数是:Table.Skip,第1参数是表(上一个查询步骤返回的表),第2参数是4;即删除前4行。
2.3 多个工作表的数据都需要跳过前几行
具体解决步骤见下一节
3. 标题的上面有报表信息
第一行到第N行是关于报表的属性信息,比如说制作时间、制作人等。这些信息是否要添加到汇总的数据表格中?
以下图为例:需要将四个字段添加数据字段
结果如下:
3.1 报表信息可忽略
可忽略的情况下,直接跳过前几行,即删除前几行
- 在开始套
Table.Skip函数之前,可以使用转换 - 大写功能来自动生成公式后,然后改写公式来解析工作薄数据。
这里在改写Excel.Workbook时不必添加第二参数true。
![[图片]](https://i-blog.csdnimg.cn/direct/5bb529007a794344951659db8eacbd20.png)
-
进行以上操作后,在
Excel.Workbook外面再套上Table.Skip,到这里还不能开始合并表格数据,还需要将第一行提升为标题。![[图片]](https://i-blog.csdnimg.cn/direct/94c0bd0a99f44e2a856f8f99c9ce7f49.png)
-
操作的子表,要将标题处理好,然后再合并表格数据。
在套函数的时候,不用担心自己记不住单词,PowerQuery有自动提示并补全,我们只需补全。
![[图片]](https://i-blog.csdnimg.cn/direct/10e358514c6243db9ffa4df7be8462b5.png)
-
在
Table.Skip外面再套上Table.PromoteHeaders来将第一行提升为标题。![[图片]](https://i-blog.csdnimg.cn/direct/f4a8ec57c0a546ac8ecb6c5ea211ea2a.png)
-
以上步骤完成了跳过前4行,提升标题,全部在一个查询步骤里面完成。剩下的数据汇总需要新建查询步骤来完成,新的查询步骤取
Content列,然后套上Table.Combine,即可完成多个工作表的汇总![[图片]](https://i-blog.csdnimg.cn/direct/5335e4b22de2421c9b89dc77ad52d1fa.png)
3.2 报表信息需要添加新的数据字段
不能忽略的情况下,将表格分为两部分进行处理,在改写时较为麻烦,尤其是多个工作表需要进行相同的操作时。
掌握let..in的结构,将单个工作表处理的过程转换为自定义函数来解决这个问题。
3.2.1 单个工作表的处理方法
-
照例,先使用
Table.TransformColumns处理Content列来获取到表格内容,预览表格数据,并点击Table文字来获取单个表。![[图片]](https://i-blog.csdnimg.cn/direct/370c5cb4a7cb4e8f9ef3cf9530cb7d29.png)
-
单个工作表数据结构如下,两部分需要单独处理,然后合并在一起。
![[图片]](https://i-blog.csdnimg.cn/direct/9e08f3d2c06f4598ad6fd31359b27feb.png)
-
双击查询步骤(红色框),修改一下查询步骤名称,方便我们接下来的查询步骤。查询步骤名称暂修改为:
Start。双击无效的,可先单击,然后按下F2;或进入【高级编辑器】进行修改。
-
先提取上半部数据,提取后进行转置、标题提升,查询步骤取名
Cols。插入下一步的时候,记得要修改查询步骤的来源是:
StartTable.FirstN(Start,4),FirstN用来提取表格的前几行。使用功能:主页 - 保留行 - 保留最前面几行![[图片]](https://i-blog.csdnimg.cn/direct/0bc2091b84a149048740b7670c956dc2.png)
-
转置,转置后需要将第一行提升为标题并删除空行
![[图片]](https://i-blog.csdnimg.cn/direct/5f82e4599ffa4aac871610cde72367f3.png)
-
处理好的上半部数据如下,只有一行记录。将最后处理好的查询步骤改名为
AddCols。![[图片]](https://i-blog.csdnimg.cn/direct/ebc36e7b8e3c48e399357d585c3bfcaa.png)
-
再提取下半部数据,注意函数的第一参数是查询步骤
Start,新查询步骤取名Data。Table.PromoteHeaders(Table.Skip(Start,4))![[图片]](https://i-blog.csdnimg.cn/direct/1bb6731d4a7441378dd58d72cd21213b.png)
-
两部分数据准备好之后,想办法把这两部分拼起来,有两种方法。
这一步即是把
AddCols表格中的唯一行,扩展至Data表格的每一行。1. 第一种:
Table.AddColumn,添加自定义列。-
以添加【制作人】为例:把
AddCols当作字段内容添加进去,然后在M公式中对AddCols取行、列。![[图片]](https://i-blog.csdnimg.cn/direct/f2b7fa1d87ee4f96a945212acac14188.png)
-
取行、取列,拿到制作人的值。其他的列信息,依次添加
Table.AddColumn函数取值![[图片]](https://i-blog.csdnimg.cn/direct/71d9b62d6c4648f6ab50be6b234f01f4.png)
2. 第二种:Table.TranformRows,循环处理每一行,同时增加多个字段。
上述自定义列添加的方法,过于麻烦,如果要添加的信息过多,需要写的函数也很多,并且没有扩展性不强
-
使用
Table.TranformRows取每一行,M公式中的_代表记录行record。这个函数将表
Data转换成了一个列表,列表中的每一个元素是表Data的每一行记录,那可以将AddCols中的唯一行与Data中的每一行进行拼接。![[图片]](https://i-blog.csdnimg.cn/direct/2d636f2ad86e4f038dd908aa2b469c3c.png)
-
将记录行拼接:
_&AddCols{0},再次预览时Record时,新的字段已经被添加进去了![[图片]](https://i-blog.csdnimg.cn/direct/d536fa0dc10947ae9de43717c14a5fbb.png)
-
将
Record的列表,恢复成表格:Table.FromRecords,新的表格已经有了新的字段,并且没有任何硬编码,理论上AddCols中有N个字段都能够拼接。不会有自定义列的限制。![[图片]](https://i-blog.csdnimg.cn/direct/d3b1b188f8f049e181c6a37ffd5eaf26.png)
-
3.2.2 将单个工作表的处理方法转换为自定义函数
简单认识一下自定义函数的结构,其实PowerQuery的自定义函数结构随处可见,只不过因为形式多变,都不怎么注意的到它。
更为详细的可阅读网络上其他材料:自定义函数 – Power Query爱好者
-
最简单的结构:
(x)=>x,通常被简写成each _。若某个函数只需要接收_一个参数的时候,each _可被省略。![[图片]](https://i-blog.csdnimg.cn/direct/e562403f89db41afb6abe9a4ac738ba8.png)
-
复杂一点的结构:
(x) => let 源 = x in 源,let用来储存查询步骤,in用来输出最后的结果。查询步骤内也可以再套let .. in。![[图片]](https://i-blog.csdnimg.cn/direct/db0755463c574918b291947bd5aedf1d.png)
从这里开始修改:
-
右击查询名称,点击创建函数,这里会创建一个无参数的自定义函数,名称随意就好,这里取
Fx。![[图片]](https://i-blog.csdnimg.cn/direct/6ac99bcc0d6d4b5fbc7d62bd9c926af8.png)
-
创建完成后,还需要进行修改;
![[图片]](https://i-blog.csdnimg.cn/direct/a8c2a050d268402a82d2ca72892bfe98.png)
-
把查询步骤
Start转换为输入参数,修改并不难,只需要两三步( )内填写Start- 第3行至第5行直接删除
- 最外层的
let..in想删就删,不会影响结果![[图片]](https://i-blog.csdnimg.cn/direct/defbf20fba0c44c4a696c8fa6b63a48f.png)
![[图片]](https://i-blog.csdnimg.cn/direct/28a9896df78e4fefb878b05c02c12d39.png)
3.2.3 应用自定义函数,处理多个工作表
-
最后来检验一下自定义函数的效果
![[图片]](https://i-blog.csdnimg.cn/direct/86b758970a1d44a88fe394095a8fd8c0.png)
-
复制一份新的查询,删除掉从
Start开始的查询步骤。![[图片]](https://i-blog.csdnimg.cn/direct/91dc74439bf445948177270a489f01c7.png)
-
直接以
Excel.Workbook(_){0}[Data]作为自定义函数Fx的参数。预览处理后的数据,需要转换的报表信息已经正常添加至数据表格。![[图片]](https://i-blog.csdnimg.cn/direct/2f96d7c9154c40b8b34b36eb071e3ae7.png)
-
最后将数据表格汇总,依然是使用
Table.Combine。![[图片]](https://i-blog.csdnimg.cn/direct/d64f90c64d324880bdd90336fd95db66.png)
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
![[图片]](https://i-blog.csdnimg.cn/direct/944392e7c9d54d12b7c6043fb3407f3c.png)
![[图片]](https://i-blog.csdnimg.cn/direct/bf4a173c1792469fbd216d779f4307aa.png)
![[图片]](https://i-blog.csdnimg.cn/direct/a4db403c52d74f958654fb83f194f37f.png)


所有评论(0)