【问题标题】:Power Query: Combine two tables from 1 file and repeat procedure for all files within one folder?Power Query:合并一个文件中的两个表并为一个文件夹中的所有文件重复过程?
【发布时间】:2019-07-19 13:32:54
【问题描述】:

我有几张结构相同的 Excel 表格。从每个 excel 表中,我需要两个表。

我知道如何使用 Power Query 组合同一文件的两个表,并且我知道如何在一个文件夹中组合多个文件。

但我不知道如何设置查询,以便 Power Query 首先组合一个文件的两个表,然后对文件夹的所有文件重复此步骤,这样我就得到了所有文件的两个表组合在一张桌子上。

有什么建议或提示吗?

谢谢!

【问题讨论】:

    标签: excel powerquery


    【解决方案1】:

    如果您发布了一些代码,则更容易回答。我假设你的意思是:

    我有几个结构相同的 Excel 工作表 工作簿。从每个 excel sheet workbook 我需要两张表。

    因为你接着说:

    ...组合一个文件的两个表,然后对文件夹的所有文件重复此步骤,这样我就得到了所有文件的两个表 ...

    以下是我认为您想要实现的目标。


    假设我在某个 Excel 工作簿中有两个表格(见下面的蓝色表格和黄色表格),我想将它们合并。

    我可以使用如下代码组合我的两个表(前提是我将查询加载到与包含表的 Excel 工作簿不同的 Excel 工作簿中):

    let
        someExcelFile = Excel.Workbook(File.Contents("C:\someFolder\Book1.xlsx")),
        firstTable = someExcelFile{[Name="Table1"]}[Data], // Or however you're getting your first table.
        secondTable = someExcelFile{[Name="Table2"]}[Data], // Or however you're getting your second table.
        combineTwoTables = Table.Combine({firstTable, secondTable}) // Or however you're combining the two tables.
    in
        combineTwoTables
    

    (假设您有类似上面的内容。在上面的代码中,我通过名称来识别表,但您可能会以其他方式识别它们。)


    然后说我在某个文件夹中还有多个 Excel 工作簿,每个包含两个表(就像上面显示的那样),它们也需要提取/组合。

    为了在我文件夹中的每个 Excel 工作簿上使用上述内容,一种方法可能是将其更改为接受任何文件作为参数的函数。比如:

    let
        CombineTwoTablesInSomeExcelFile = (someFile as binary) as table =>
            let
                someExcelFile = Excel.Workbook(someFile),
                firstTable = someExcelFile{[Name="Table1"]}[Data], // Or however you're getting your first table.
                secondTable = someExcelFile{[Name="Table2"]}[Data], // Or however you're getting your second table.
                combineTwoTables = Table.Combine({firstTable, secondTable}) // Or however you're combining the two tables.
            in combineTwoTables
    in
        CombineTwoTablesInSomeExcelFile
    

    函数接受二进制类型参数的原因是Folder.Files(在下面用于访问文件夹中的文件)返回一个包含每个文件(在该文件夹中)作为二进制文件的列。换句话说,这很方便,我们可以将该列中的值直接传递给我们的函数(希望有意义)。

    要针对文件夹中的所有文件调用该函数并将结果合并到一个表中,我们可以使用如下内容:

    let
        CombineTwoTablesInSomeExcelFile = (someFile as binary) as table =>
            let
                someExcelFile = Excel.Workbook(someFile),
                firstTable = someExcelFile{[Name="Table1"]}[Data], // Or however you're getting your first table.
                secondTable = someExcelFile{[Name="Table2"]}[Data], // Or however you're getting your second table.
                combineTwoTables = Table.Combine({firstTable, secondTable}) // Or however you're combining the two tables.
            in combineTwoTables,
        filesInFolder = Folder.Files("C:\someFolder\"), // Change to whatever the folder is on your computer.
        relevantFiles = Table.SelectRows(filesInFolder, each List.Contains({".xlsx"}, [Extension])),
        invokedFunction = Table.AddColumn(relevantFiles, "toCombine", each CombineTwoTablesInSomeExcelFile([Content]), type table),
        combinedAllTables = Table.Combine(invokedFunction[toCombine])
    in
        combinedAllTables
    

    结束的几点:

    • 我尝试过滤文件夹中的文件以仅包含某些文件扩展名。在您的情况下,您可能需要将文件扩展名添加到列表中。
    • 函数内没有实现错误处理。因此,如果您向函数传递一个不是包含两个表的 Excel 文件的文件(或者如果提取两个表所需的步骤与函数中的步骤/逻辑不同),那么您可能会收到错误消息。 (您也不应该在文件夹中包含包含此查询的工作簿。)

    【讨论】:

      【解决方案2】:

      这是另一种方式。

      打开 Excel。 单击数据 > 新查询 > 从文件 > 从文件夹。 浏览并选择包含您要使用的 Excel 文件的文件夹。文件夹在“文件夹路径”文本输入框中列出后,单击“确定”。

      点击转换数据。

      在这里,您可以过滤列中的信息,以将文件限制为仅包含您要使用的文件。

      单击“内容”列右上角的“合并文件”按钮。

      选择列出的第一个表并单击“确定”。

      单击查询“从文件夹转换示例文件”以将其打开以进行编辑。对每个文件进行的所有转换都在这里完成。

      选择导航应用步骤,然后选择转换 > 检测数据类型。 在引入您将使用的第一个表的导航步骤和将引入第二个表的下一步之间需要此数据类型检测步骤。如果这两个步骤之间没有步骤,则使用图形用户界面,第二个表格将替换导航步骤中的第一个表格。我不知道为什么,但确实如此。

      为了确保您理解下面看到的内容,我的表格在所有电子表格中都命名为 Table1 和 Table2。在第一个电子表格中,每个表都有使用以下约定的条目:

      T(for table) #C(for column) #R(for row) #

      所以对于 Spreadsheet1、Table1、Column1:

      T1C1R1
      T1C1R2
      ...
      

      再次选择导航应用步骤,然后复制编辑栏中的内容。

      单击编辑栏左侧的 fx 并将您刚刚复制的内容粘贴到编辑栏中显示的内容上。换句话说,将出现的内容替换为您刚刚复制的内容。然后将 Item= 之后列出的表名替换为第二个表的名称,然后按 Enter。

      现在您可以对两个表执行合并:最初在导航步骤中引入的一个,以及后来引入的一个(在我的示例中,引入第二个表的应用步骤称为 Custom1)。我会使用我更改类型的每个实例......所以第一个表的更改类型和第二个表的更改类型1。

      现在,追加 Table1 和 Table2: 点击 Changed Type1 Applied Step,然后点击 Home > Append Queries,然后从下拉列表中选择 Transform Sample File from Folder (Current),然后点击 OK。

      然后,在编辑栏中,将第一个 #"Changed Type1" 更改为 #"Changed Type" 并按 Enter。

      现在回到原来的查询。我的被​​称为文件夹。您会看到所有电子表格及其附加表格都已相互附加。

      只是为了让您了解您在上面完整附加的列表中看到的内容,对于其他电子表格,我添加了一个文件编号。我使用了约定:

      F(for file) #T(for table) #C(for column) #R(for row) #

      所以对于 Spreadsheet2、Table1、Column1:

      F2T1C1R1
      F2T1C1R2
      ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多