不知道“Parameter Table”确切翻译是什么,我直译为“参数表格”。参数表格的意思是:PowerQuery的参数可以根据用户输入来实现动态化。
目前我最常用到的场景是:当我将PowerQuery数据模板做好之后,其他不熟悉PowerQuery的伙伴只需要提供简单的输入——比如文件或文件夹路径——就可以自动生成结果。
场景再实例化一下:我做了一个学习报告模板,有各种复杂的计算。这个模板需要从某个系统导出三个原始表:学习报表、所有学员名单和课程信息表。如果这个模板只供我一个人使用,毫无问题;当我需要把这个模板提交给其他伙伴使用时,他们就需要自己从系统中导出三个表然后修改模板的PowerQuery代码,这将是一场灾难。避免灾难的方法是尽可能将模板代码封装,只让其他伙伴导出三个文件,将文件路径填写到Excel表格即可。这就是参数表格发挥作用的地方。
以下是操作步骤和代码:
1.首先在Excel中创建参数表格,这个表格只有两列:参数和值。因为这整个思路是我抄的英文资源的,所以我偷懒照搬英文列名:“Parameter”和“Value”。然后用插入表格或套用表格的方式,将区域转化成表格,记得将表格命名为“Parameters”【图1】。注意左上角的“表名称”。Value列就是需要用户输入的地方,在这个例子中我的同事只需要将Value列相应值修改为自己导出的三个文件的全路径就可以了。
2.然后新建一个查询,选择“从表格”创建【图2】。这一步是创建包含参数值的查询,便于后面从这个查询里引用参数值。因为PowerQuery是没法直接从表格引用值的。创建过程比较简单,一路默认和确定即可,不再截图演示。因为是从已经命名的表格创建的,所以查询名自动继承了表格名字“Parameters”。
3.现在要创建一个函数,因为只有函数才会拥有动态变化的值。直接点击“新建查询-从其他源-空白查询”,创建一个空白查询,点击“高级编辑器”,删除里边的所有代码,把下面代码粘贴进去然后保存,并把该查询命名为“fnGetParameter”(这也是直接照搬的)。
//括号和等号加右箭头是函数的标志,括号里的是函数的参数,或者叫变量。如果把第一行拿掉,其实就是一个完整的查询。加上第一行就把这个查询封装成为一个函数了。
(ParameterName as text) =>
let
//获取刚才创建的Parameters表格
ParamSource = Excel.CurrentWorkbook(){[Name="Parameters"]}[Content],
//这一步其实是让参数表格的行可以无限扩充,不再局限于本例中的三行。注意在“in”前的都是一条语句,并且有缩进,我这里偷懒没缩进。整条语句蛮抽象,我自己也还没完全弄懂其内部的运作原理,直接照搬了。
ParamRow = Table.SelectRows(ParamSource, each ([Parameter] = ParameterName)),
Value=
if Table.IsEmpty(ParamRow)=true
then null
else Record.Field(ParamRow{0},"Value")
in
Value
4.接下来创建三个查询,分别是“学习报表”、“人员信息”和“课程信息”,然后对这三个查询进行各种复杂的Shaping也好,Calculating也好,然后加载到数据模型,然后根据需要添加计算列、计算字段,创建数据透视表、数据透视图乃至PowerView。十八般武艺样样上吧,做出一个真实的报告来就ok。具体步骤不赘述。
5.报告创建好之后,我要想让我的同事能够使用我的牛逼报告模板的关键一步来了:将上一步写死的源文件位置,替换成参数表格里的值。
将“学习报表”查询“let”后面的“源=……”替换成:
源 = Excel.Workbook(File.Contents(fnGetParameter("学习报表文件位置")), null, true),
将“人员信息”查询“let”后面的“源=……”替换成:
源 = Excel.Workbook(File.Contents(fnGetParameter("人员信息文件位置")), null, true),
将“课程信息”查询“let”后面的“源=……”替换成:
源 = Excel.Workbook(File.Contents(fnGetParameter("课程信息文件位置")), null, true),
6.为了便于同事识别,我将Parameters表所在的sheet名称重命名为“请修改”,并在表格区域外加上了使用这个模板的说明,这样他们一看就知道自己要干嘛【图3】。
7.保存该Excel文件,然后发给同事。
8.同事只需要导出三个对应的文件,保存在本地,然后打开此模板,分别填写三个文件的全路径信息,然后点击“刷新”,就获取到最新的数据了,保险起见,在数据透视表、数据透视图也刷新下吧。