Power Query 介绍
Power Query 是微软提供的工具,Excel 2013 版作为插件加载使用,从 Office 2016 版开始,Power Query 的功能集成到 Excel 中,可以直接使用。微软推出 Power BI Desktop 后,一系列的工具,比如 Power Query, Power Pivot, Power View 等,都集成在其中。Power Query 定位查询,中文一般翻译为超级查询,主要作用是连接不同种类的数据源,进行数据的转换。下图来自微软官方对 Power Query 的介绍,可以帮助理解。Power Query 主要实现连接和转换功能。
Power Query 是一种数据连接技术,可用于发现、连接、合并和优化数据源以满足分析需要。 Power Query 的功能在 Excel 和 Power BI Desktop 中可用。
网上关于 Power Query 以及 Power Query 内置的 M 语言的教程并不多,所以计划撰写系列博客,尽量以案例的方式,讲解 Power Query 和 M 语言 (M 语言后被改名为 Power Query Query Language)的使用方法。本文先从一个例子,说明 Power Query 的典型步骤和 Power Query 主要构成。
Power Query 实现工作表汇总
给出一个在 Excel 中处理有点难度的东西:工作表数据合并,如下图所示:
如果只有几个 Excel 工作表,可以用拷贝和粘贴来解决。如果是多个 Excel 工作表呢?我特意在网上搜索了一下,知乎上有两篇文章,一篇是基于 VBA 的,另一篇是基于数据透视表多重合并计算区域的。
VBA 对于普通 Excel 用户来说,掌握的人并不多。有了 Power Query 之后呢,合并工作表就变得轻而易举了。大家先跟着我做,刚开始不理解的地方也暂时放过,后面随着理解的加深,很多细节就由熟悉变成轻松驾驭了。
打开一个新的 Excel 工作簿,切换到【数据】页面,然后通过菜单【获取数据】- 【来自文件】- 【从工作簿】,找到数据源的 Excel 工作簿。
点击【导入】按钮,因为 Excel 工作簿有多个工作表,我们先选择其中一个,比如 Jan 工作表进行导入。后面解释原因。
现在 Sheet1 中可以看到一月份的数据,并且右边多了一个 查询和连接 面板。在这个面板中,有一个名为 Jan 的查询,双击这个查询,进入 Power Query 编辑器 界面。
通过这个界面,我来解释一下 Power Query 的主要构成要素:
左边是查询,现在有一个查询,查询名为 Jan
。
右边是步骤。查询由步骤组成。我们可以试着用鼠标依次点击每一个步骤,这时可以发现,中间的显示区数据会跟着变化。比如当我们点击第一步:源,显示区的显示如下:
我们看到,这一步骤中,Power Query 读取 sales.xlsx 文件,识别出工作部有三个工作表。工作表的名称分别为 Jan, Feb 和 Mar,这三个工作表的内容(Data) 字段为 Table 类型数据 (Table 是 Power Query 三大容器类型的数据类型之一)。我们可以点击任意一行的 Data 字段,显示区的下方相应显示 Table 的内容。
点击第二个步骤,显示区显示如下:
可以看出,根据我们刚开始的选择,Power Query 选择了 Jan 这个工作表。第三个步骤,Power Query 将第一行作为列名,第四个步骤,Power Query 尝试帮我们确定每一列的数据类型。
从这里可以看出,Power Query 将我们数据处理过程中的步骤都记录下来了,并且在每一步,都能够可视化查看数据的变化,而这一切都是基于 M 语言的。在主页和视图两个选项卡都有高级编辑器按钮,点击后进行 M 语言代码的查看和编辑界面:
现在看来可能比较懵,后面我们要对 M 语言进行剖析,大家可以跟着我来一起学习。
再回到操作步骤,点击步骤前面的删除图标,删除除源之外的所有步骤:
这个时候的界面应该是下面这个样子:
在显示区中,删除除 Data 外所有列,删除后显示区的界面如下:
注意到 Data 列右边下图所示的图标了吗?这个图标表示的操作叫做“展开”,可以对 Table 的内容展开到明细。
展开操作动图:
后面还需要两个步骤的操作:将第一行作为标题:
另外,多个 Sheet 的表头都作加载到行中,行数据可以使用筛选功能将不需要的表头筛选掉:
完成这些操作后,主页页签中“关闭并上载”,处理的结果即可以上载到 Excel 工作表,这是结果数据。如果源数据有变化,比如某一条记录发生变化,新增一个工作表,都可以通过刷新按钮更新数据。
以下是 M 语言脚本:
let
源 = Excel.Workbook(File.Contents("C:\Users\StoneWM\Desktop\monthly-sales\sales.xlsx"), null, true),
删除的列 = Table.RemoveColumns(源,{"Name", "Item", "Kind", "Hidden"}),
#"展开的“Data”" = Table.ExpandTableColumn(删除的列, "Data", {"Column1", "Column2", "Column3", "Column4"}, {"Column1", "Column2", "Column3", "Column4"}),
筛选的行 = Table.SelectRows(#"展开的“Data”", each true),
提升的标题 = Table.PromoteHeaders(筛选的行, [PromoteAllScalars=true]),
更改的类型 = Table.TransformColumnTypes(提升的标题,{{"Month", type text}, {"Name", type text}, {"Product", type text}, {"Sales", type any}}),
筛选的行1 = Table.SelectRows(更改的类型, each ([Month] <> "Month"))
in
筛选的行1
最后,我们总结一下对 Power Query 的初步印象:Power Query 的核心是查询对象,通过查询对象连接不同的数据源获取数据,并对数据进行处理和转换,得到处理后的结果。处理过程的每一个步骤都通过 M 语言脚本被记录下来,从而实现处理过程自动化。