不知道“Parameter Table”確切翻譯是什么狠半,我直譯為“參數(shù)表格”。參數(shù)表格的意思是:PowerQuery的參數(shù)可以根據(jù)用戶輸入來實現(xiàn)動態(tài)化癌椿。
目前我最常用到的場景是:當我將PowerQuery數(shù)據(jù)模板做好之后玖绿,其他不熟悉PowerQuery的伙伴只需要提供簡單的輸入——比如文件或文件夾路徑——就可以自動生成結(jié)果肴敛。
場景再實例化一下:我做了一個學習報告模板,有各種復雜的計算停团。這個模板需要從某個系統(tǒng)導出三個原始表:學習報表、所有學員名單和課程信息表袭艺。如果這個模板只供我一個人使用搀崭,毫無問題;當我需要把這個模板提交給其他伙伴使用時猾编,他們就需要自己從系統(tǒng)中導出三個表然后修改模板的PowerQuery代碼瘤睹,這將是一場災難。避免災難的方法是盡可能將模板代碼封裝答倡,只讓其他伙伴導出三個文件轰传,將文件路徑填寫到Excel表格即可。這就是參數(shù)表格發(fā)揮作用的地方瘪撇。
以下是操作步驟和代碼:
1.首先在Excel中創(chuàng)建參數(shù)表格获茬,這個表格只有兩列:參數(shù)和值。因為這整個思路是我抄的英文資源的倔既,所以我偷懶照搬英文列名:“Parameter”和“Value”恕曲。然后用插入表格或套用表格的方式,將區(qū)域轉(zhuǎn)化成表格渤涌,記得將表格命名為“Parameters”【圖1】佩谣。注意左上角的“表名稱”。Value列就是需要用戶輸入的地方实蓬,在這個例子中我的同事只需要將Value列相應值修改為自己導出的三個文件的全路徑就可以了茸俭。
2.然后新建一個查詢,選擇“從表格”創(chuàng)建【圖2】安皱。這一步是創(chuàng)建包含參數(shù)值的查詢调鬓,便于后面從這個查詢里引用參數(shù)值。因為PowerQuery是沒法直接從表格引用值的练俐。創(chuàng)建過程比較簡單袖迎,一路默認和確定即可,不再截圖演示腺晾。因為是從已經(jīng)命名的表格創(chuàng)建的燕锥,所以查詢名自動繼承了表格名字“Parameters”。
3.現(xiàn)在要創(chuàng)建一個函數(shù)悯蝉,因為只有函數(shù)才會擁有動態(tài)變化的值归形。直接點擊“新建查詢-從其他源-空白查詢”,創(chuàng)建一個空白查詢鼻由,點擊“高級編輯器”暇榴,刪除里邊的所有代碼厚棵,把下面代碼粘貼進去然后保存,并把該查詢命名為“fnGetParameter”(這也是直接照搬的)蔼紧。
//括號和等號加右箭頭是函數(shù)的標志婆硬,括號里的是函數(shù)的參數(shù),或者叫變量奸例。如果把第一行拿掉彬犯,其實就是一個完整的查詢。加上第一行就把這個查詢封裝成為一個函數(shù)了查吊。
(ParameterName as text) =>
let
//獲取剛才創(chuàng)建的Parameters表格
ParamSource = Excel.CurrentWorkbook(){[Name="Parameters"]}[Content],
//這一步其實是讓參數(shù)表格的行可以無限擴充谐区,不再局限于本例中的三行。注意在“in”前的都是一條語句逻卖,并且有縮進宋列,我這里偷懶沒縮進。整條語句蠻抽象评也,我自己也還沒完全弄懂其內(nèi)部的運作原理炼杖,直接照搬了。
ParamRow = Table.SelectRows(ParamSource, each ([Parameter] = ParameterName)),
Value=
if Table.IsEmpty(ParamRow)=true
then null
else Record.Field(ParamRow{0},"Value")
in
Value
4.接下來創(chuàng)建三個查詢仇参,分別是“學習報表”嘹叫、“人員信息”和“課程信息”,然后對這三個查詢進行各種復雜的Shaping也好诈乒,Calculating也好罩扇,然后加載到數(shù)據(jù)模型,然后根據(jù)需要添加計算列怕磨、計算字段喂饥,創(chuàng)建數(shù)據(jù)透視表、數(shù)據(jù)透視圖乃至PowerView肠鲫。十八般武藝樣樣上吧员帮,做出一個真實的報告來就ok。具體步驟不贅述导饲。
5.報告創(chuàng)建好之后捞高,我要想讓我的同事能夠使用我的牛逼報告模板的關鍵一步來了:將上一步寫死的源文件位置,替換成參數(shù)表格里的值渣锦。
將“學習報表”查詢“l(fā)et”后面的“源=……”替換成:
源 = Excel.Workbook(File.Contents(fnGetParameter("學習報表文件位置")), null, true),
將“人員信息”查詢“l(fā)et”后面的“源=……”替換成:
源 = Excel.Workbook(File.Contents(fnGetParameter("人員信息文件位置")), null, true),
將“課程信息”查詢“l(fā)et”后面的“源=……”替換成:
源 = Excel.Workbook(File.Contents(fnGetParameter("課程信息文件位置")), null, true),
6.為了便于同事識別硝岗,我將Parameters表所在的sheet名稱重命名為“請修改”,并在表格區(qū)域外加上了使用這個模板的說明袋毙,這樣他們一看就知道自己要干嘛【圖3】型檀。
7.保存該Excel文件,然后發(fā)給同事听盖。
8.同事只需要導出三個對應的文件胀溺,保存在本地裂七,然后打開此模板,分別填寫三個文件的全路徑信息仓坞,然后點擊“刷新”背零,就獲取到最新的數(shù)據(jù)了,保險起見无埃,在數(shù)據(jù)透視表捉兴、數(shù)據(jù)透視圖也刷新下吧。