1、List.Combine从字面上也很好理解,就是把多个List合并起来:
2、如下图是不同家庭的数据,每家户主在第一行(如黄色标注单元格),户主下面到下一个户主之间是该家庭成员。要求每个家庭显示成一行。
3、首先,选中数据区域中任意单元格,点击【数据】-【自表格/区域】将数据加载到Power Query编辑器中,生成一个名字叫Source的Table。
4、第二步,用Table.Group函数按“与户主关系”列分组,注意使用Table.Group的第五参数。生成结果如下,每个家庭的成员放进了一个Table。
5、=Table.Group(Source,"与户主关系",{"New",each_},0,(x,y)=>Number.From(y="户主"))
6、第三步,要想办法把每个Table里的多行转化成一行,由于列名不能重复,因此姓名、性别等列名需要加上1、2、3、4等用来区分家庭里的不同成员。使用Table.ColumnNames函数获取列名,然后转换即可。
7、let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content], A = T锾攒揉敫able.Group(Source,"与户主关系",{"New",each [ a=Table.ColumnNames(_), b=List.TransformMany({1..Table.RowCount(_)},each a,(x,y)=> y&Text.From(x) ) ][b] } ,0,(x,y)=>Number.From(y="户主") )in A
8、第四步,标题生成以后,还需要把每个家庭多行的人员信息(每个人信息为一个List)连接起来形成一个List,这里就用到了我们介绍的函数List.Combine!List.Combine(Table.ToRows(_))
9、第五步,把生成的标题和内容连接起来生成一个新的一行的Table。
10、let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content], A = T锾攒揉敫able.Group(Source,"与户主关系",{"New",(z)=> #table( List.TransformMany( {1..Table.RowCount(z)},each Table.ColumnNames(z),(x,y)=> y&Text.From(x) ), { List.Combine(Table.ToRows(z)) } ) } ,0,(x,y)=>Number.From(y="户主") )in A
11、最后,深化出New列,然后再将每个家庭的Table合并起来再上载到Excel工作表中就可以了。
12、最终代码如下:let Source = Excel.CurrentWorkbook(){[Name=&qu泠贾高框ot;Table1"]}[Content], A = Table.Group(Source,"与户主关系",{"New",(z)=> #table( List.TransformMany( {1..Table.RowCount(z)},each Table.ColumnNames(z),(x,y)=> y&Text.From(x) ), { List.Combine(Table.ToRows(z)) } ) } ,0,(x,y)=>Number.From(y="户主") )in Table.Combine(A[New])
13、个人建议最终效果如图所示。