【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 工資條