【PowerQuery】如何一行程式碼搞定,做了一萬遍的工資條

  • 2020 年 9 月 28 日
  • 筆記

學過excel同學,工資條做了一萬遍。

前面已經了解了Excel、VBA、Python實現工資條,今天嘗試用PQ做一遍

做之前迷惑了很久,如何能自定義長度

 

 Table有Repeat函數,但是List沒有。看來另外想辦法

 

 

 

 一步步接近目標

 

 

 

 請出今天的主角

插入行:插入哪張表,插入行號(即索引0開始),插入內容(即行列表(記錄))

簡單點:什麼表。什麼位置,插入什麼數據

下面是單行和多行

 

 

 

 源數據:為了方便截圖,行數限制4行

 

 

第一次:隔行插入標題

= List.Accumulate({1..Table.RowCount(源)},源,(x,y)=>Table.InsertRows(x,y*2-2,{Record.FromList(Table.ColumnNames(x),Table.ColumnNames(x))}))

 

 第二次:插入空行

= List.Accumulate({1..Table.RowCount(b)-1},b,(x,y)=>Table.InsertRows(x,(y-1)*3,{Record.FromList(Text.Split(Text.Repeat("a",Table.ColumnCount(b)-1),"a"),Table.ColumnNames(x))}))

 

 最後綜合:一次插入空行和標題

= List.Accumulate({1..Table.RowCount(源)},源,(x,y)=>Table.InsertRows(x,(y-1)*3,{Record.FromList(Text.Split(Text.Repeat("a",Table.ColumnCount(源)-1),"a"),Table.ColumnNames(x)),Record.FromList(Table.ColumnNames(x),Table.ColumnNames(x))}))

 

 

 最後跳過表前2行

 

 ———————————————————————————————————————

如果用一行程式碼就是

= Table.Skip(List.Accumulate({1..Table.RowCount(源)},源,(x,y)=>Table.InsertRows(x,(y-1)*3,{Record.FromList(Text.Split(Text.Repeat("a",Table.ColumnCount(源)-1),"a"),Table.ColumnNames(x)),Record.FromList(Table.ColumnNames(x),Table.ColumnNames(x))})),2)

對應高級編譯器

let
    源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
    工資條 = Table.Skip(List.Accumulate({1..Table.RowCount(源)},源,(x,y)=>Table.InsertRows(x,(y-1)*3,{Record.FromList(Text.Split(Text.Repeat("a",Table.ColumnCount(源)-1),"a"),Table.ColumnNames(x)),Record.FromList(Table.ColumnNames(x),Table.ColumnNames(x))})),2)
in
    工資條

 

————————————————————緊急更新–替換 生成 重複 空列表演算法——————————————

List有Repeat功能,我疏忽了,又被現實啪啪打臉

= List.Repeat({""},3)

 

 所有程式碼重新調整

第一次:不變

第二次:

= List.Accumulate({1..Table.RowCount(b)-1},b,(x,y)=>Table.InsertRows(x,(y-1)*3,{Record.FromList( List.Repeat({""},Table.ColumnCount(b)),Table.ColumnNames(x))}))

 最後綜合:

= List.Accumulate({1..Table.RowCount(源)},源,(x,y)=>Table.InsertRows(x,(y-1)*3,{Record.FromList( List.Repeat({""},Table.ColumnCount(b)),Table.ColumnNames(x)),Record.FromList(Table.ColumnNames(x),Table.ColumnNames(x))}))

一行程式碼:

= Table.Skip(List.Accumulate({1..Table.RowCount(源)},源,(x,y)=>Table.InsertRows(x,(y-1)*3,{Record.FromList( List.Repeat({""},Table.ColumnCount(b)),Table.ColumnNames(x)),Record.FromList(Table.ColumnNames(x),Table.ColumnNames(x))})),2)

高級編譯器:

let
    源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
    工資條 = Table.Skip(List.Accumulate({1..Table.RowCount(源)},源,(x,y)=>Table.InsertRows(x,(y-1)*3,{Record.FromList( List.Repeat({""},Table.ColumnCount(b)),Table.ColumnNames(x)),Record.FromList(Table.ColumnNames(x),Table.ColumnNames(x))})),2)
in
    工資條