不知道“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.同事只需要導出三個對應的文件,保存在本地,然后打開此模板,分別填寫三個文件的全路徑信息,然后點擊“刷新”,就獲取到最新的數據了,保險起見,在數據透視表、數據透視圖也刷新下吧。