返回目录:excel表格制作
我们讲过了很多次的List.Transform与List.TransformMany循环与嵌套循环,其实工资表到工资条就是一个循环控制,每条数据添加一行标题:
工资表用这个表代替,ABC是标题行,下面是内容:
我们要的结果是这样的:
为了便于理解我们分步来进行:
我们会用到5个函数:
Table.ToRows:表格数据变成列表
Table.ColumnNames:获取表格列名称
Table.FromRows:从行数据生成表
List.TransformMany:多重循环
List.Transform:单选环
Table.ToRows:
这个函数很简单,它生成一个由列表组成的列表,列表的列表,最终的数据内容是表的一行数据:
Table.ColumnNames:
这个函数也很容易理解,得到的是表格列名称的列表,俗称表头:
Table.FromRows:
这个函数要求的参数是列表的列表,也就是Table.ToRows产生的那样的结果:
我们用LR作为参数就生成了一个COLUMN为默认表头的表格。
List.TransformMany:
这个函数有点复杂,能够得到的参考也有限:
三个参数:
- 第一参数:列表
- 第二参数:函数指向嵌套列表,单个参数
- 第三参数:结果函数,双参数,x对应第一参数列表元素,y对应第二参数
我们看第一个例子:
- T[A]:表格的A列是一个列表
- (x)=>T[B]:第二参数指向表格B列
- (x,y)=>x&y:结果是A列B列合并
再看一个例子:
这里的第二参数我们没有使用自定义形式的,使用的是each,这里”_“代表的是第一参数中的元素,同样的结果函数下,得到是A列的重复。
List.Transform:
我们使用单循环来做这个表格:
List.Transform(LR,each Table.FromRows({TN,_}))
{TN,_}:TN是表格的列标题名称列表,_代表的是LR的元素,而LR是表格转换成的列表,外侧的大括号,声明由这两个列表组成一个新的列表。
Table.FromRows({TN,_}):由行数据生成一个表格。
List.Transform(LR,each Table.FromRows({TN,_})):LR一共有三行数据,每行数据添加一行表头生成了三个表格。
我们把这个表格组成的列表展开就得到了我们想要的工资条。
经过上面的准备,我们用List.TransformMany来制作工资条:
我们来看这样的一个列表,第二行是表格数据的第一行,第一行就是原来的表头。
List.TransformMany(LR,each {TN,_},(x,y)=>y)
LR = Table.ToRows(T)
TN = Table.ColumnNames(T)
其实我们在第二参数中做了列表组合,第一参数中的元素也就是每行数据与表头做组合,结果就返回这个组合。
这个就是最终的结果,与上面的写法稍有不同,就是第二参数的写法:
- each _
- (x)=>
这两种形式是可以互相替换的。
最外层我们用Table.FromRows就直接得到我们想要的结果。
以上是我们制作工资条的分步,把这个过程中的代替参数写成M函数本体,就是整个条语句:
我们在实际解决问题的过程中,也可以使用这样的方法,如果对于问题没有直接的思路,可以先分步实现,最后做出组合,这有点像Excel中写公式一样,用辅助列先做出分步结果,得到最终结果,然后再试着编写一条公式解决问题