【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 工资条