Excel:Power Query函数入门
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 = Table.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 = 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
A

11、最后,深化出New列,然后再将每个家庭的Table合并起来再上载到Excel工作表中就可以了。

12、最终代码如下:
let
Source = Excel.CurrentWorkbook(){[Name="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、个人建议
最终效果如图所示。
