如何用递归LAMBDA或Power Query扁平化Excel层级并获取所有路径?
Excel 层级路径生成方案
一、修正递归LAMBDA函数(返回所有路径)
原函数仅返回第一条路径,核心问题是未遍历FILTER返回的所有子节点数组,也未将多分支路径扁平化输出。以下是修正后的函数:
=LAMBDA(start, LET( nextItems, FILTER(T_DATA[datasource], T_DATA[dataset]=start), IF( COUNTA(nextItems)=0, start, TOCOL(MAP(nextItems, LAMBDA(item, start&">"&GetPath(item))), 3) ) ) )
关键修改说明:
- 用
COUNTA(nextItems)判断是否存在子节点,替代原函数的空值判断(避免数组判断失效) - 用
MAP遍历所有子节点nextItems,对每个节点递归调用GetPath生成完整路径 - 用
TOCOL(...,3)将递归返回的多维路径数组扁平化,输出为单行或多行的路径列表
使用方式:在单元格输入=GetPath(D1),按Ctrl+Shift+Enter(Excel 365可直接回车,动态数组自动溢出),即可生成所有层级路径。
二、Power Query 递归实现方案
步骤如下:
加载数据到Power Query:选中T_DATA表格,点击「数据」选项卡 → 「从表格/区域」,将数据导入Power Query编辑器。
创建递归自定义函数:
在Power Query编辑器中,点击「主页」→ 「高级编辑器」,替换原有代码为以下内容:
let Source = Excel.CurrentWorkbook(){[Name="T_DATA"]}[Content], // 定义递归函数:输入起始节点,返回所有完整路径 GetAllPaths = (start as text) as list => let // 获取当前节点的所有子节点 Children = Table.SelectRows(Source, each [dataset] = start)[datasource], // 递归处理每个子节点,拼接路径 Paths = if List.IsEmpty(Children) then {start} else List.Transform(Children, (child) => start & ">" & GetAllPaths(child)), // 扁平化嵌套列表 FlattenedPaths = List.Combine(Paths) in FlattenedPaths, // 调用函数,替换为你的起始单元格值(如D1) Result = GetAllPaths(Excel.CurrentWorkbook(){[Name="D1"]}[Content]{0}[Column1]) in Result
- 输出结果:点击「关闭并上载」,即可将所有层级路径加载到Excel工作表中。
关键说明:
Children通过Table.SelectRows筛选当前节点的所有子节点- 递归时用
List.Transform遍历子节点,拼接父节点与子节点的递归路径 List.Combine将嵌套的路径列表扁平化,得到一维的完整路径列表
内容的提问来源于stack exchange,提问作者Laurent Bosc
相关产品推荐
相关产品推荐

