强大的查询功能:将1个文件中的两个表合并,然后对一个文件夹中的所有文件重复执行此过程?

时间:2019-07-19 13:32:54

标签: excel powerquery

我有几张具有相同结构的Excel工作表。在每个Excel工作表中,我需要两个表。

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

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

有什么建议或提示吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

如果您发布了一些代码,则将更易于回答。我想你是说:

  

我有几个具有相同结构的excel 工作表 工作簿。在每个excel 工作表 工作簿中,我需要两个表。

因为你继续说:

  

...组合一个文件的两个表,然后对文件夹的所有文件重复此步骤,从而得到所有文件的两个表 ...

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


说在某些Excel工作簿中有两个表(请参阅下面的蓝色表和黄色表),我想将其合并。

Two tables

我可以使用下面的一些代码合并两个表(前提是我将查询加载到与包含表的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文件(或者,提取两个表所需的步骤与函数中的步骤/逻辑不同),则可能会出现错误。 (您也不应在文件夹中包含包含此查询的工作簿。)

答案 1 :(得分:0)

这是另一种方式。

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

enter image description here

点击转换数据。

enter image description here enter image description here

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

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

enter image description here

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

enter image description here

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

enter image description here

选择“应用导航”步骤,然后选择“变换”>“检测数据类型”。 在“导航”步骤(将要使用的第一个表引入)和下一步(将引入第二个表)之间,需要进行“数据类型检测”步骤。如果没有这两个步骤之间的任何步骤,而是使用图形用户界面,则第二个表将仅替换“导航”步骤中的第一个表。我不确定为什么,但是确实如此。

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

T(用于表)#C(用于列)#R(用于行)#

因此,对于Spreadsheet1,Table1和Column1:

T1C1R1
T1C1R2
...

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

enter image description here

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

enter image description here

现在,您可以与两个表进行合并:一个是最初在Navigation步骤中引入的,另一个是后来引入的(在我的示例中,引入第二个表的Applied步骤称为Custom1)。我将使用每个实例的类型,在这些实例中,我更改了类型...因此,对于第一个表,请更改类型,对于第二个表,请更改Type1。

现在,添加表1和表2: 单击“更改的Type1应用步骤”,然后单击“主页”>“追加查询”,然后从下拉列表中选择“从文件夹转换样本文件(当前)”,然后单击“确定”。

enter image description here enter image description here

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

enter image description here

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

enter image description here

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

F(用于文件)#T(用于表)#C(用于列)#R(用于行)#

对于Spreadsheet2,表1,列1:

F2T1C1R1
F2T1C1R2
...