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


學過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
    工資條

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM