使用 Power Query 从 Excel 缩进中提取层次结构

Posted

技术标签:

【中文标题】使用 Power Query 从 Excel 缩进中提取层次结构【英文标题】:Using Powerquery to extract hierarchy from Excel indent 【发布时间】:2021-07-22 08:33:46 【问题描述】:

我正在使用导出.xls 数据文件进行分析的业务应用程序。我想使用 PowerQuery 将这些导入 Excel。

数据有一个层次结构,但它仅由first column 的缩进表示。没有前导零或其他字符。

Powerquery M 似乎没有返回缩进级别的函数。

我发现的其他方法依赖于计算前导零,但这对我不起作用。

在此过程中,我使用 Cell.IndentLevel 属性编写了一个简单的 Excel 自定义函数,效果很好,但我想让 PowerQuery 执行此操作,因此只有一个导入代码。

问:Powerquery 能否访问 Excel 单元格.indentlevel 值?或者它可以执行自定义 Excel 函数吗?我还能如何处理这个问题?

【问题讨论】:

如果文件是 .xlsx 或 .xlsm 文件,它实际上是一个包含多个 xml 文件的 zip 文件。您必须编写一个 PQ 函数来直接访问这些,然后您可以从该信息中整理出样式属性。我认为仅使用您的 Excel 函数会很多更简单,并向您的数据添加一个“帮助列”,将缩进级别转换为层次结构。 【参考方案1】:

编辑 - Ron Rosenfield 非常正确地提到这个缩进问题可能是基于 Excel 的,看起来 Power 查询没有缩进处理程序。

这可能是因为 Excel 缩进级别不是数据层次结构的 ISO 方法。

因此,您只需应用一个帮助列,该列将蛮力给出缩进级别,然后电源查询可以处理其余部分。

应该这样做,根据需要进行修改,它将检测并应用一个数字

Sub Macro1()

    Dim MyCell As Variant
    Range("A:A").Insert
    For Each MyCell In Range("A1:A10") 'Change this to be Dynamic
        MyCell.Value = MyCell.Offset(, 1).IndentLevel
    Next MyCell
    
End Sub

Oooh 还从外部暂存...“Transform”ETL 的一部分 (Extract、Transform、Load) 嗯,大部分时间缩进由空格处理.

除了 XLS 之外,您还有其他选项吗,因为在 CSV 中缩进的处理方式可能不同。

在不讽刺地命名的 Power Query 功能区的转换选项卡中,您可以通过分隔符空间使用 拆分列。 (除了制表符之外,更常见的缩进分隔符之一。)

这将允许您对数据进行分组,如果还有其他空间会有点混乱,但您可以采取措施来处理它

或者,您可以在“转换”选项卡中使用其他选项,否则您可以使用它,因为没有您要从中导出的系统示例,很难说这是 Excel 缩进还是缩进实际适用。

结果

【讨论】:

OP 声明数据按缩进级别隔离; 不是前导空格。 没有看到 OP 缩进的例子很难处理,通常程序化的缩进是由前导空格或前导制表符完成的,这两者都在 PQ 中处理。因此,如果存在破坏 PQ 的替代方案,那么看看数据的来源会很有趣。 在 Excel 中,IndentLevel 是范围对象的属性。它与制表符或空格无关。 是的,我知道 Excel 在这方面的功能,但是,OP 声明此数据是 ETL "using a business application that exports .xls data files for analysis"。所以 Excel 可能根本不会将它们作为缩进级别处理。我修改了我的帖子以强调这一点,因为我注意到我假设其他人会知道这一点。 OP 写道,他的工作 VBA 例程正在使用 Cell.IndentLevel 属性

以上是关于使用 Power Query 从 Excel 缩进中提取层次结构的主要内容,如果未能解决你的问题,请参考以下文章

Excel 2016 Power Query - 从 Oracle 数据字典中获取数据

Excel Power Query导入MySQL数据

Excel Power Query 重复 OData 请求

如何使用Power Query动态汇总文件夹下多个Excel文件

SharePoint 列表数据的 Excel Power Query 导入更改日期/时间值

Excel数据建模——提高Power Query数据处理效率