zoukankan      html  css  js  c++  java
  • 【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
        工资条
  • 相关阅读:
    sprintf使用
    Android ListView保持选中项高亮
    Creational Patterns创建型模式
    C和指针终于看到指针这一章
    C++随笔001
    TCP reset
    开始看设计模式英文版了
    Excel条件求和
    linux中安装软件,查看、卸载已安装软件方法
    linux vi文本编辑器三种模式切换及常用操作
  • 原文地址:https://www.cnblogs.com/hightech/p/13746595.html
Copyright © 2011-2022 走看看