PowerQuery解决相对路劲动态刷新的问题

首先感谢原作者慷慨分享,本文转自:http://www.jianshu.com/p/d6766d07448d  王华庭

不知道“Parameter Table”确切翻译是什么,我直译为“参数表格”。参数表格的意思是:PowerQuery的参数可以根据用户输入来实现动态化。

目前我最常用到的场景是:当我将PowerQuery数据模板做好之后,其他不熟悉PowerQuery的伙伴只需要提供简单的输入——比如文件或文件夹路径——就可以自动生成结果。

场景再实例化一下:我做了一个学习报告模板,有各种复杂的计算。这个模板需要从某个系统导出三个原始表:学习报表、所有学员名单和课程信息表。如果这个模板只供我一个人使用,毫无问题;当我需要把这个模板提交给其他伙伴使用时,他们就需要自己从系统中导出三个表然后修改模板的PowerQuery代码,这将是一场灾难。避免灾难的方法是尽可能将模板代码封装,只让其他伙伴导出三个文件,将文件路径填写到Excel表格即可。这就是参数表格发挥作用的地方。

以下是操作步骤和代码:

1.首先在Excel中创建参数表格,这个表格只有两列:参数和值。因为这整个思路是我抄的英文资源的,所以我偷懒照搬英文列名:“Parameter”和“Value”。然后用插入表格或套用表格的方式,将区域转化成表格,记得将表格命名为“Parameters”【图1】。注意左上角的“表名称”。Value列就是需要用户输入的地方,在这个例子中我的同事只需要将Value列相应值修改为自己导出的三个文件的全路径就可以了。

2.然后新建一个查询,选择“从表格”创建【图2】。这一步是创建包含参数值的查询,便于后面从这个查询里引用参数值。因为PowerQuery是没法直接从表格引用值的。创建过程比较简单,一路默认和确定即可,不再截图演示。因为是从已经命名的表格创建的,所以查询名自动继承了表格名字“Parameters”。

3.现在要创建一个函数,因为只有函数才会拥有动态变化的值。直接点击“新建查询-从其他源-空白查询”,创建一个空白查询,点击“高级编辑器”,删除里边的所有代码,把下面代码粘贴进去然后保存,并把该查询命名为“fnGetParameter”(这也是直接照搬的)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//括号和等号加右箭头是函数的标志,括号里的是函数的参数,或者叫变量。
//如果把第一行拿掉,其实就是一个完整的查询。加上第一行就把这个查询封装成为一个函数了。
 
(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”后面的“源=……”替换成:

1
源 = Excel.Workbook(File.Contents(fnGetParameter("学习报表文件位置")), null, true),

将“人员信息”查询“let”后面的“源=……”替换成:

1
源 = Excel.Workbook(File.Contents(fnGetParameter("人员信息文件位置")), null, true),

将“课程信息”查询“let”后面的“源=……”替换成:

1
源 = Excel.Workbook(File.Contents(fnGetParameter("课程信息文件位置")), null, true),

6.为了便于同事识别,我将Parameters表所在的sheet名称重命名为“请修改”,并在表格区域外加上了使用这个模板的说明,这样他们一看就知道自己要干嘛【图3】。

7.保存该Excel文件,然后发给同事。

8.同事只需要导出三个对应的文件,保存在本地,然后打开此模板,分别填写三个文件的全路径信息,然后点击“刷新”,就获取到最新的数据了,保险起见,在数据透视表、数据透视图也刷新下吧。

雾中有雾 釉里有釉

发表评论

电子邮件地址不会被公开。 必填项已用*标注

返回主页看更多
狠狠的抽打博主 支付宝 扫一扫