Power Query 的设计目的就是在业务分析师使用数据之前将数据加载到目标区域的表中。收集数据并将其重塑为所需的格式,Power Query 处理数据的基本流程,如图 1-1 所示。

图 1-1 是 Power Query 执行过程的描述
Extract:提取 Connect to Data:连接到数据 Transform:转换 Reduce:筛选 Clean:清洗 Reshape:重塑 Load:加载 Define Data Types:指定数据类型 Load to Destination:加载到目标区域
当然,可以在任何时候对这个过程的任何部分进行任何调整。事实上,本书就是在讲解如何这样做的。但是,在开始时,梳理并理解 Power Query 的宏观运行流程还是很有帮助的。
在开始 Power Query 使用之前,建议对 Power Query 界面的默认设置做一些更改。由于微软默认关闭了某些功能,而其中一些功能对于更高效地使用 Power Query 是至关重要的,所以,本书会先在这里给出最佳实践。
调整 Excel 中的默认设置。
虽然还可以进行其他选项设置,但目前这些就足够了。
调整 Power BI 桌面版中的默认设置。
【注意】 在 Power BI 桌面版的选项中,可能还想查看【全局】【预览功能】选项卡,看看是否有什么吸引人的新功能。由于新功能首先发布在 Power BI 桌面版上,所以对于想要了解 Excel 中的 Power Query 即将出现的功能来说,这是一个很好的地方。
在本章节中,将看到在 Excel 或 Power BI 中导入一个简单的 “CSV” 文件到 Power Query 中,用来展示 Power Query 是如何处理上述任务的、它在用户界面上是如何显示的,以及它在这两个工具中的相同之处。
ETL 过程从 “提取” 步骤开始。在这个步骤中有四个不同的子任务,如图 1-2 所示。

图 1-2 数据 “提取” 过程的四个子步骤
Settings:设置 Authentication:认证 Data Preview:数据预览 Query Destination:查询目的地
第一步是选择和配置想要使用的数据连接器。在这种情况下,首先创建一个新的查询,使用 Excel 中的 “CSV” 连接器,如图 1-3 所示。
1. 单击【数据】【获取数据】【来自文件】【从文本 / CSV】。
这相当于 Power BI 桌面版中的以下操作。
2. 单击【主页】【获取数据】【更多】【文件】【文本 / CSV】。

图 1-3 在 Excel(左)或 Power BI 桌面版(右)中连接到一个 “文本 /CSV” 文件
需要注意的是,在这两个工具中,有更直接的方式单击连接到 “文本 / CSV” 文件。由于 “文本 / CSV” 文件是一种非常常见的数据源,所以连接它的功能已经直接在用户界面上给出,不需要单击进子菜单再选择。在 Excel 中,会发现这个连接器就在【数据】选项卡上的【获取数据】按钮旁边。而在 Power BI 中,连接器就在【获取数据】菜单栏的第一层子菜单【常见数据源】,不需要单击【更多】后浏览。但作为一种通用的连接到数据源的方法,这里只是展示了一套完整的操作流程以便于可以应对各种情况。
【注意】 Power BI 桌面版实际上可以连接到比 Excel 更多的数据源。开发团队通常将测试版的连接器先发布到 Power BI 中,一旦通过测试阶段,会最终将它们发布到 Power BI 和 Excel 中。
一旦选择了需要使用的连接器后,就能浏览并找到文件。在这种情况下,将连接到以下示例文件:“第 01 章 示例文件 \Basic Import.csv” 。
(译者注:每章示例文件都分成了不含有参考答案的用来练习的版本以及包括参考答案在内的完成版本,当打开完成版本时由于路径不一致的问题会导致报错,请读者自行修改为本机对应的文件路径以使其正常运行)
许多数据源在连接到它们之前都需要进行身份验证。如果需要连接的数据源属于这种情况,会被提示需要提供身份验证信息。凑巧的是,本案例一个存储在自己本地文件系统中的 “CSV” 文件,本机用户肯定有权限能访问它,也就意味着已经通过了身份验证。
一旦选择了文件,就会被带到如图 1-4 所示的窗口。

图 1-4 Power Query 的预览窗口
这个窗口的目的是预览 Power Query 将要处理的数据的内容,允许在 Power Query 开始正式转换过程之前做任何必要的更改。总的来说,很少需要在这里更改任何内容,因为 Power Query 在大多数情况下都能做出正确的默认选择。说到这里,会注意到在顶部有一些选项,允许切换以下设置。
另一件需要注意的重要事情是,由于大小限制,数据预览是被截断的信息。这一点非常重要,因为在这个窗口中可以显示的数据量是有限的。
(译者注:有时候真正出错的问题来自非预览的部分,要在企业实战中注意这一点。)
最后,不太可能在这个预览中更改任何内容。预览窗口的主要目的其实是展示数据的状态和结构,现在来查看这个数据是否符合如下三种情况之一。
相信 “80%-90%” 的数据在使用前都需要或多或少进行某种形式的转换。转换的程度可能很简单(只是重命名一列),也可能很复杂。然而,无论需要什么样的转换,这里的默认操作不应该是单击【加载】,而应该是单击【转换数据】。
对数据进行预览后,确定这是需要使用的数据,此时单击【转换数据】按钮,来启动 Power Query 窗口,如图 1-5 所示。

图 1-5 Excel 中的 Power Query 编辑器窗口
ETL 过程的下一步是转换数据。然而,与 Excel 导入数据的经典方法不同,Power Query 允许用户查看和修改系统在转换过程中的默认转换。这些都是在 Power Query 编辑器窗口中管理的,这个窗口在单击【转换数据】按钮后启动。
这里给出 Power Query 编辑器的七个主要区域,每一个区域都在图 1-6 中都有编号。

图 1-6 对 Power Query 编辑器界面的详细介绍
这些区域的分别是如下。
在第一次从一个文件中提取数据时,了解 Power Query 已经做了什么是很有帮助的。为了做到这一点,将重点关注右侧的【应用的步骤】窗口中列出的步骤。会注意到,这里已经列出了三个步骤。
需要注意的关键是,这些步骤中的每一个步都是可修改或可选的,所以可以准确的看到 Power Query 在导入文件时到底做了什么。
(译者注:让查询步骤使用英文而不是中文是操作 Power Query 的最佳实践,其原因在于该英文信息含有的过去式形态可以提示用户此步骤是完成后的状态,同时该步骤的英文名称往往与此步骤所用的 M 函数相关,有助于更快速的学习和理解 Power Query。如果你的步骤是中文的,可以单击【文件】【选项和设置】【查询选项】【全局】【区域设置】【查询步骤】勾选【始终使用英语】即可。本书后续内容均保持查询步骤使用英语以便理解最佳实践,当然这不是必须的,在查询步骤中使用本地化语言,如:中文对 Power Query 的使用没有任何影响,取决于个人习惯。)
默认情况下,每个查询的第一步都被称为 “Source(源)”,无论它来自什么数据源。在【应用的步骤】窗口中选择它后,预览结果就会显示 Power Query 对其提取的原始数据的最原始状态,如图 1-7 所示。

图 1-7 “Source” 步骤的可视化显示结果
在 ETL 过程的这个阶段,Power Query 已经确定了原始数据集中的每个逗号应该被用作列的分隔符,并且它已经这样做了,但此时还没做进一步的转换。
这个提取的过程中,Power Query 的内部算法解析了数据源的内容并以表显示。第 1 行看起来与接下来的几行不同,它看起来像一个标题。
当单击 “Promoted Headers(将第一行用作标题)” 步骤时,将会看到 Power Query 显示的预览。它使用第 1 行的内容作为各自列标题,取代了之前的无意义的 Column1、Column2 等列标题,如图 1-8 所示。

图 1-8 “Promoted Headers” 步骤的结果
当前查询的最后一步被称为 “Changed Type(更改的类型)”,如图 1-9 所示。

图 1-9 列标题显示 “Changed Type” 步骤结果
这个步骤背后的逻辑是,Power Query 已经扫描了每一列的前 200 个值,并对这些列的数据类型做出了判断。然后它自动增加了这一步,在将数据加载到目的地之前 “锁定” 这些数据类型。会看到的最常见的数据类型如下所示。
【注意】 实际上,Power Query 中还有很多数据类型,将在以后的章节中更详细地讨论这些数据类型。
(译者注:作为最佳实践,要注意这个数据类型推断是基于每列的前 200 行,是双刃剑,既可以自动推断数据类型,也可能由于样本太少而导致推断错误。例如:前 100 行订单的折扣都是 0,而后续订单的折扣会出现类似 0.75 的小数,此处的类型推断结果就是整数,这是错误的,读者应注意这点,在企业级项目中避免引入不易察觉的错误隐患,应对的方式是:在数据正式加载前对数据类型做一次检查。)
到目前为止,Power Query 已经提供了很大的帮助,并且似乎已经正确地完成了一切。但是,如果想对数据再做一些更改呢?
从删除一个不需要的列开始:“POS Hour” 列(永远不会在这个层面上分析这个数据集中的这个数据)。要做到这一点,有两个方法。
请注意,这两个方法是等价的,用一种即可,这一列都会被删除,在【应用的步骤】窗口中会出现一个名为 “Removed Columns(删除的列)” 的新步骤,如图 1-10 所示。

图 1-10 “Removed Columns” 的步骤已经删除了 “POS Hour” 列
但是,等等,如果还是需要那一列呢?没有问题,可以直接删除 “Removed Columns” 步骤。但现在不打算这么做,如果想这么做,可以到【应用的步骤】窗口,单击 ”Removed Columns“ 步骤左边的 “X”。这个步骤将被删除,而该列的所有数据将再次可见。基本上可以把这看作是 Power Query 的 “撤销” 功能,只是它效果更好。与撤消功能不同的是,当关闭应用程序时,撤销功能将丢失,而 Power Query 撤消功能会一直存在,直到修改它为止。
【注意】 虽然可以撤销一个步骤是非常重要的,但这个功能还有一个更大的意义,它允许用户可以在任何时候单击任何东西,只是为了看看它做了什么。Power Query 总是在数据副本上工作,所以并不会损害真正的原始数据源。这给了用户重要的能力,可以肆意尝试任何按钮,并了解 “我想知道点这里会发生什么” 这个问题。只要单击它,如果不喜欢这个结果,只需删除这个步骤即可。这就鼓励用户对任何不了解的命令步骤都可以这样做。此时不仅可能会发现新的功能,还能帮助用户理解【应用的步骤】中的描述与产生这些描述的功能的对应关系。
(译者注:这是用来学习 Power Query 的重要技巧,这符合人的自然学习天性,即:第一步:随便试试看。第二步:哦,我理解了。第三步:我用用看。第四步:我忘了,但我已经掌握了。Power Query 中的操作可以大胆尝试,不会出现任何风险。从这个意义上:单位时间内尝试的次数决定了学习掌握 Power Query 的学习时间。)
现在,回到修改数据步骤,来简化列名,从 “Item Name” 列开始。
一个名为 “Renamed Columns(重命名的列)” 的新步骤将出现在【应用的步骤】窗口中,会发现一个规律:每次在 Power Query 中执行一个操作,都会有一个新步骤被添加到【应用的步骤】窗口中。
这其中的含义相当重要。与经典的 Excel 世界不同,在那里,数据是在完全没有任何跟踪的情况下进行转换的,Power Query 提供了一个完整的转换检查路径。默认情况下,通过用户界面执行的每个步骤都会被添加到【应用的步骤】窗口中。虽然用户可能不知道驱动这个转换的命令在哪里,但至少可以看到发生了什么类型的转换,如果选择上一步,甚至可以看到应用转换之前的数据状态是什么样子(然后只需选择后面的步骤就可以看到数据转换后的状态)。
现在,如果决定重命名另一列,会发生什么?会再次得到一个新的步骤吗?一起来找出答案。就像在 Excel 中有多种方法处理同一个问题一样,在 Power Query 中也有多种方法处理同一个问题。这次要重命名列,请执行如下操作。
注意观察该变化是如何发生的,但是这次没有出现一个新的步骤。仍然只有一个名为 “Renamed Columns” 的步骤,如图 1-11 所示。

图 1-11 这两个重命名操作已被合并为一个 “Renamed Columns” 步骤中
请注意,无论是右击并【重命名】列还是双击列重名它,这里的结果都是相同的。当依次执行两个 “类似” 的操作时,Power Query 将把它们合并到一个步骤中。这样做的原因很简单:它使步骤列表更短,更容易阅读。由于许多文件需要进行大量的数据清洗,所以这对用户来说是合理的。
【注意】 当然,这个功能也它的有另一面。比方说,假设重命名了六个列,然后意识到不小心错误的重命名了某个列。虽然可以删除这个步骤,但这将删除整个步骤,包括正确的五个重命名操作。还有一个解决方案,可以把列重新命名为原来的名字,或者使用正如在本书后面将学到的,编辑 M 代码公式。
(译者注:这个设计是非常合理的,要看出这点,只需要观察 Power Query 公式编辑栏的内容即可发现,要删除某一列的重命名也可以在公式栏中调整。这并不意味着用户需要学习 M 公式,因为可以看出来,正如:这是考试时可以推测的选择题而不是问答题。)
综上,得到了这样一个查询,它已经执行了如下操作。
对于这个数据集,这样就足够了。数据是干净的表格格式,它已经准备好用来驱动商业智能。现在是最后确定查询的并完成查询的时候了。
在最终确定查询之前,为数据集中的每一列重新定义数据类型是非常重要的。这样做的原因将在后面的章节中讨论,希望用户在 Power Query 旅程的一开始就能养成良好的习惯。事实上,微软也是这样做的,这就是 Power Query 默认在每个查询的最后一步添加更改数据类型步骤的原因。
虽然可以单击每一列左上方的图标来选择适当的数据类型,但这可能会花费相当多的时间,特别是当大量的列需要处理时。另一个技巧是让 Power Query 为所有列设置数据类型,然后覆盖想更改的数据类型。要做到这一点需要进行如下操作。
这生成一个新的 “Changed Type” 步骤,称为 “Changed Type1(更改的类型 1)” 被添加到查询中,如图 1-12 所示。

图 1-12 重新设置每列数据类型的效果
为什么是 “Changed Type1” 呢?答案是,查询在步骤列表的前面已经有一个 “Changed Type”( Power Query 在最初提升标题后自动添加的步骤)。这个步骤有助于强调一些更重要的事情,即了解 Power Query 的工作原理。
是否必须使用这个步骤的名称呢?不是的,虽然通常鼓励用户让步骤保持不变,并学习是哪些用户界面命令生成的这些步骤,但如果想做出一些更改,也是可以重命名它们的,如下所示。
【注意】 唯一不能以这种方式重命名的步骤是 “Source” 步骤。要重命名 “Source” 步骤,需要编辑查询的 M 代码。
默认情况下,一个查询步骤会使用数据源的名称作为查询的名称。由于 “Basic Import(基本导入)”(默认生成的名称)不是很理想,所以要把它改成更符合逻辑的名字。

图 1-13 重命名查询和最后的查询步骤的结果
为了最终完成查询并将数据加载至 Excel 中,需要进行如下操作。
此时,Power Query 将把在查询中建立的步骤不仅应用于一直在处理的预览数据,而且还将其应用于整个数据源。当然,根据数据源的大小和查询的复杂性,需要的时间是不同的。完成后,将数据加载到新工作表中的一个表中,如图 1-14 所示。

图 1-14 在 Excel 中加载的 “Transactions” 查询
在图 1-14 中,突出显示了 Excel 用户界面中的三个单独的元素。
【注意】 这三个元素中的每一个都可以被重新命名,并且不需要为了继续工作而彼此保持同步。
(译者注:默认情况,Power Query 加载到 Excel 中的表,是一种绿色风格的主题,通过这个直观细节,可以判断那些是 Power Query 加载的表。当然,这不是绝对精准的做法。)
在 Power BI 与 Excel 中加载查询的唯一区别是按钮的名称。
与 Excel 一样,Power Query 将把查询步骤应用于整个数据源。主要区别在于,在 Power BI 中数据最终将被加载到 Power BI 数据模型中。一旦完成,将会看到表在如图 1-15 所示位置显示出来。

图 1-15 在 Power BI 桌面版中加载的 “Transactions” 表
Excel 在【查询 & 连接】窗格中显示了加载的总行数的汇总,而 Power BI 则没有。幸运的是,从右边的【字段】列表中选择一个表切换到【数据】区域时,仍然可以看到这些信息。当这样做时,加载的总行数将显示在页面的左下角。
【注意】 与 Excel 不同,Power BI 会默认按第一列对数据进行排序。要在 Excel 中做到这一点,需要在数据加载之前添加一个明确的步骤来对数据进行排序。
随着对 Power Query 功能的进一步了解,将会意识到用它来用来清洗数据,会比以前在 Excel 中使用的经典方法要有效得多。但真正的好处是,当源数据文件更新时,可以利用 Power Query 刷新查询的功能来进行刷新,不必再执行数据清洗工作。此时,Power Query 将针对更新的数据源执行它的每一个步骤,将更新的输出加载到目的地。最棒的一点是什么呢?让刷新变得非常的容易。
在此之后,剩下的工作就是等待 Power Query 从文件中读取数据,对数据进行处理,并加载到 Excel 表或 Power BI 的数据模型中。
可以看到 Power BI 在加载数据时总是显示一个对话框,但在 Excel 中看到正在进行的刷新可能就不那么明显了。它将显示在状态栏中(在 Excel 界面左边的最底部),但这是非常微妙的很容易忽略,观察刷新过程最明显的方法是确保显示【查询 & 连接】窗格,因为刷新过程会显示在这里列出的查询上。图 1-16 显示了在 Excel 和 Power BI 中分别被刷新的查询。

图 1-16 Excel(左)和 Power BI 桌面版(右)中的查询加载进度显示
一旦数据加载完毕,Excel 将在【查询 & 连接】窗口中显示加载的总行数。在 Power BI 可以通过切换到【表工具】选项卡并选择相应的表来检查加载的总行数(如上节所述)。
这个功能对于定期更新的数据到文件中是非常有效的。无论源文件是一个多人正在更新的 Excel 文件,还是某个人每个月末提取的 “CSV” 文件,只要将数据保存上个月文件的版本中,然后轻轻单击一下就可以进行全部刷新。
虽然一键刷新很神奇,但经常构建的解决方案是需要在刷新前重新指定到不同的文件。例如,假设已经构建了一个名为 “Jan.CSV” 的文件的查询,该文件包含一月份的数据。然后将收到一个名为 “Feb.CSV” 新的数据文件 。显然,仅仅单击刷新并不能达到预期的效果,因为它只会刷新 1 月份的 “Transaction”,而不会刷新 “Feb.CSV” 文件中的 2 月份的 “Transaction”。在本例中,需要在触发刷新之前更改文件路径,这意味着将要编辑查询。为了编辑查询,需要回到 Power Query 编辑器中。执行这个操作的方法在 Excel 或 Power BI 中略有不同。
在 Power BI 中,启动 Power Query 编辑器是非常简单的。所需要做的就是转到【主页】标签并单击【转换数据】。这将打开 Power Query 编辑器,此时允许修改任何现有的查询(甚至创建新的查询),如图 1-17 所示。

图 1-17 单击【转换数据】按钮来编辑 Power BI 中的查询
在 Excel 中,实际上有三个选项可以启动 Power Query 编辑器,其中有两个是依靠处于活动状态的【查询 & 连接】窗口来启动。不幸的是,当一个新的 Excel 文件被启动时,【查询 & 连接】窗口需要手动打开,这可能会使人们出错。由于今天建立的绝大多数 Excel 解决方案都涉及 Power Query ,会发现打开 Excel 后的第一个步骤就是显示【查询 & 连接】窗格,可以通过单击以下的路径来启动它。
至于如何在 Excel 中启动 Power Query 编辑器的选项,这些是可以自由选择的。
【注意】 由于大部分时间【查询 & 连接】窗口都是打开的,所以通常使用后两种方法。曾经还开玩笑说,两者区别其实在于,是想均匀地磨损鼠标按钮,还是给鼠标左键施加更多的压力。
(译者注:其实还有第四种方法,看到一个绿色风格的表,在表上右击【表格】【编辑查询】就可以打开加载本表所用的 Power Query 查询,如果没有这个选项,则说明该表不是由 Power Query 加载的。)
一旦回到 Power Query 编辑器后,就可以选择查询在【应用的步骤】窗口中的任意步骤,对查询进行检查。当选择步骤中的任意一个步骤时,数据预览都将刷新,来显示给定步骤的结果。
【注意】 数据预览确实利用了缓存的优势。如果注意到数据已经过时,或者想确保数据没有过时,则应该强制刷新预览。要做到这一点,请单击 Power Query 【主页】选项卡上的【刷新预览】按钮,如图 1-18 所示。

图 1-18 【刷新预览】按钮可以在 Power Query 的【主页】选项卡上找到
当回到 Power Query 编辑器时,现在完全可以在查询中添加新的步骤、删除步骤,甚至修改步骤。在这个例子中,要做的是重新配置查询路径,使其指向一个新的数据文件。
【警告】 如果打开本章的 Excel 或 Power BI 示例文件,则会发现它们无法刷新。是因为 “Source” 步骤指向的数据文件是系统中的路径。按照本节中的步骤,用户可以重新指定路径,以使用正确的数据文件。
一起来看看当前的查询步骤,如图 1-19 所示。

图 1-19 “Transactions” 查询当前的步骤
可以看到一些非常重要的东西,其中有两个步骤名称的右边有一个小齿轮图标。这个齿轮图标允许用户单击启用一个用户界面来重新配置当前步骤。
【注意】 如果在 Power Query 中执行某项转换功能时,会启动一个界面来辅助配置,配置完毕后就会在该步骤旁出现一个齿轮图标,它将允许用户重新设置这个步骤。(如果某操作没有打开辅助配置界面,则很可能看不到齿轮图标)。当然,每条规则都有例外,正如在 “Promoted Header” 步骤中看到的那样。
在查看查询时,大家都知道原始数据源必须在查询的最开始被引用,幸运的是,“Souce” 步骤有一个齿轮图标。
会被带到一个新的对话框,它将允许重新配置这个步骤的关键部分,如图 1-20 所示。

图 1-20 重新配置 “Source” 步骤
这个列表中的第一个字段是【文件路径】,它恰好是想要更新的字段,需要进行如下操作。
【注意】 当第一次导入数据时,Power Query 在配置正确的选项方面做得非常好,所以这里不需要更改任何其他内容。但是,如果它选择了错误的分隔符(使用逗号而不是 Tab)呢?注意到末尾的分隔符字段了吗?如果需要,可以在这里进行更改。
如果新旧数据有显著差异,将在预览窗口中立即看到它们的改变。但在这个案例中,两个文件内容看起来是完全一样的。那么,如何判断这种更改是否有效呢?更复杂的场景是,新旧数据集在前 999 行恰好都一样,后面可能不同。那么,那该怎么办?
(先不考虑这些)这里先来加载数据。
【注意】 虽然可以在【应用的步骤】窗口中选择每个步骤来验证程序是否仍然工作,但这里不需要这样做。由于此数据具有与前一个文件相同的结构,因此将毫无问题地应用每个步骤。没有必要选择他们来检查这一点。
数据将加载,然后可以通过 Excel 【查询和连接】窗格(或在 Power BI 的【数据】区域的行数)验证效果,如图 1-21 所示。

图 1-21 数据已经从 4,575 行加载到 4,921 行
一旦习惯使用 Power Query,会发现它会对工作流程产生巨大的影响。关于这项令人惊叹的技术,有一些关键的事情需要记住。
这种价值是巨大的。考虑这样一个解决方案,构建了一个 Power Query 查询来执行一些重要的数据清洗,将结果放到 Excel 工作表的一个表中。然后,根据该数据表创建了一堆图表和报告。过去,当收到一个更新的数据文件时,需要手动重新执行所有的数据清洗步骤,然后将清洗后的数据复制并粘贴到数据表中。
有了 Power Query,所有的重复工作都不复存在了,只需单击【全部刷新】按钮,就完成了,就是这么简单。它不仅速度更快,而且保证过程每次都能一致地应用,消除了可能导致错误的人为因素。
Power Query 为用户提供了各种各样的操作数据能力,使数据清洗更容易、更快。在本书中,将了解到,以前可能很复杂的数据清洗任务,现在可以轻松地执行,允许用户更快地进入实质性工作:分析数据。
在这里,需要认识到的最后一件事是,这不是分别在 Excel 和 Power BI 学习两种工具,他们都是一个叫 Power Query 的工具,且已经被集成在包括 Excel、Power BI 桌面版在内,以及 Power BI Dataflows、Power Automation 和其他微软产品和服务中。事实表明微软在其产品中倡导 Power Query,未来也可能会出现在更多产品中。虽然学习如何使用一种新工具总会付出时间精力,但如果该工具大有前途且到处可用,这种学习不也是一项投资吗?
正在学习 Power Query 吗?可以加入本主题的交流群一些交流分享