說明
這個例子應(yīng)用面非常窄:只適合我們公司奇葩系統(tǒng)導(dǎo)出的問卷答題匯總結(jié)果帖族,如下圖:
因此,要使用此模板,必須滿足兩個條件:
1.表頭由人員信息爹凹、題目及選項組成,其中選項單獨占一行镶殷。
2.每個單元格只能有一個選項禾酱。
貼出來一是作為自己學(xué)習(xí)的記錄,二是也提供一種處理這類問題的思路參考绘趋。
思路
1.依舊要借用參數(shù)表格颤陶,自動獲取文件路徑,這樣就可以直接將原始文件和統(tǒng)計模板放到同一個文件夾陷遮,拷貝給別人后只需要替換原始文件滓走,然后打開模板文件刷新即可。
2.表格形式其實是一個透視表格式帽馋,所以需要逆透視表格搅方,將表格轉(zhuǎn)化為標(biāo)準(zhǔn)的記錄格式(或者叫數(shù)據(jù)庫格式?)绽族。
3.題目數(shù)量和選項都是動態(tài)的腰懂,但人員信息是不會變化的,因此项秉,用“逆透視其他列”绣溜。
4.題目和人員信息其實是兩類不同信息,所以需要分表娄蔼,然后用關(guān)系將兩者關(guān)聯(lián)起來怖喻。
5.由于可能存在某個選項沒有一個人選擇的情況,當(dāng)制作數(shù)據(jù)透視表時岁诉,這個沒人選的選項很可能被隱藏锚沸,因此要設(shè)置數(shù)據(jù)透視表,選擇“顯示列中的空數(shù)據(jù)項”涕癣。如下圖:
代碼
參數(shù)表格的代碼
參數(shù)表格用法詳見《PowerQuery的參數(shù)表格用法》哗蜈。
參數(shù)表格中,除了文件路徑這個參數(shù)外坠韩,我還新增了一個“人員信息列”的參數(shù)距潘,這個參數(shù)的目的在于找到原始表格中人員信息與題目信息的分界線。這需要使用者觀察原始數(shù)據(jù)只搁,然后手動填寫音比。本例中人員信息占了7列,所以填寫了7氢惋。
let
源 = (ParameterName as text) =>
let
ParamSource = Excel.CurrentWorkbook(){[Name="Parameters"]}[Content],
ParamRow = Table.SelectRows(ParamSource, each ([Parameter] =ParameterName)),
Value=
if Table.IsEmpty(ParamRow)=true
then null
else Record.Field(ParamRow{0},"Value")
in
Value
in
源
答題結(jié)果表格處理代碼
let
源 = Excel.Workbook(File.Contents(fnGetParameter("原始文件")), null, true),
數(shù)據(jù)表 = 源{[Item="Sheet1",Kind="Sheet"]}[Data],
刪除的頂端行 = Table.Skip(數(shù)據(jù)表,2),
逆透視的列 = Table.UnpivotOtherColumns(刪除的頂端行, List.FirstN(Table.ColumnNames(刪除的頂端行),fnGetParameter("人員信息列")), "屬性", "值"),
重命名的列 = Table.RenameColumns(逆透視的列,List.Zip({List.FirstN(Table.ColumnNames(刪除的頂端行),fnGetParameter("人員信息列")), Record.FieldValues(Record.SelectFields(源{[Item="Sheet1",Kind="Sheet"]}[Data]{0},List.FirstN(Table.ColumnNames(刪除的頂端行),fnGetParameter("人員信息列"))))}))
in
重命名的列
【注意】洞翩,“刪除的頂端行”這一步稽犁,我選擇了刪除前面的兩行,這是由原始數(shù)據(jù)文件的表頭決定的——因為原始數(shù)據(jù)表頭有合并單元格骚亿,導(dǎo)入PowerQuery后合并單元格被拆散已亥,表頭變成了兩列。如果現(xiàn)在不刪除来屠,后面會有一個額外動作需要剔除表頭陷猫。
表頭刪除后,在“重命名的列”這一步的妖,我又把刪除的表頭從“源”里找回來了绣檬。
題目表格
let
源 = Excel.Workbook(File.Contents(fnGetParameter("原始文件")), null, true),
數(shù)據(jù)表 = 源{[Item="Sheet1",Kind="Sheet"]}[Data],
保留的第一行 = Table.FirstN(數(shù)據(jù)表,2),
刪除的列 = Table.RemoveColumns(保留的第一行,List.FirstN(Table.ColumnNames(數(shù)據(jù)表),fnGetParameter("人員信息列"))),
自定義1 = Table.DemoteHeaders(刪除的列),
轉(zhuǎn)置表 = Table.Transpose(自定義1),
向下填充 = Table.FillDown(轉(zhuǎn)置表,{"Column2"}),
重命名的列 = Table.RenameColumns(向下填充,{{"Column1", "題目序號"}, {"Column2", "題目"}, {"Column3", "選項"}})
in
重命名的列
“重命名的列”這一步不是必須,只是為了便于理解嫂粟。注意fnGetParameter("人員信息列")引用的是參數(shù)表格中第二行的值娇未。
最后結(jié)果
注意選項D,由于沒有任何人選擇星虹,所以如果不設(shè)置“顯示列中的空數(shù)據(jù)項”零抬,D選項就不會出現(xiàn),這樣就失真了——會讓人以為題目沒有設(shè)置D選項宽涌。