【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