You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用递归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 递归实现方案

步骤如下:

  1. 加载数据到Power Query:选中T_DATA表格,点击「数据」选项卡 → 「从表格/区域」,将数据导入Power Query编辑器。

  2. 创建递归自定义函数:
    在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
  1. 输出结果:点击「关闭并上载」,即可将所有层级路径加载到Excel工作表中。

关键说明:

  • Children通过Table.SelectRows筛选当前节点的所有子节点
  • 递归时用List.Transform遍历子节点,拼接父节点与子节点的递归路径
  • List.Combine将嵌套的路径列表扁平化,得到一维的完整路径列表

内容的提问来源于stack exchange,提问作者Laurent Bosc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 01:22:39