我有几张具有相同结构的Excel工作表。在每个Excel工作表中,我需要两个表。
我知道如何使用Power Query合并同一文件的两个表,并且知道如何在一个文件夹中合并多个文件。
但是我不知道如何设置查询,这样Power Query会首先合并一个文件的两个表,然后对文件夹的所有文件重复此步骤,从而得到所有合并的文件的两个表在一张桌子上。
有什么建议或提示吗?
谢谢!
答案 0 :(得分:0)
如果您发布了一些代码,则将更易于回答。我想你是说:
我有几个具有相同结构的excel
工作表工作簿。在每个excel工作表工作簿中,我需要两个表。
因为你继续说:
...组合一个文件的两个表,然后对文件夹的所有文件重复此步骤,从而得到所有文件的两个表 ...
以下是我认为您要实现的目标。
说在某些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
收盘要点:
答案 1 :(得分:0)
这是另一种方式。
打开Excel。 单击数据>新建查询>从文件>从文件夹。 浏览并选择包含要使用的Excel文件的文件夹。在“文件夹路径”文本输入框中列出该文件夹后,单击“确定”。
点击转换数据。
在这里,您可以过滤列中的信息以将文件限制为仅要使用的文件。
点击“内容”列右上方的“合并文件”按钮。
选择列出的第一个表,然后单击“确定”。
单击查询“从文件夹转换示例文件”以打开它进行编辑。在这里可以完成对每个文件的所有转换。
选择“应用导航”步骤,然后选择“变换”>“检测数据类型”。 在“导航”步骤(将要使用的第一个表引入)和下一步(将引入第二个表)之间,需要进行“数据类型检测”步骤。如果没有这两个步骤之间的任何步骤,而是使用图形用户界面,则第二个表将仅替换“导航”步骤中的第一个表。我不确定为什么,但是确实如此。
为了确保您了解下面看到的内容,我的表在所有电子表格中都分别命名为Table1和Table2。在第一个电子表格中,每个表都有使用以下约定的条目:
T(用于表)#C(用于列)#R(用于行)#
因此,对于Spreadsheet1,Table1和Column1:
T1C1R1
T1C1R2
...
再次选择“应用导航”步骤,然后复制编辑栏中的内容。
单击编辑栏左侧的fx,然后将刚复制的内容粘贴到编辑栏上显示的内容上。换句话说,将出现的内容替换为您刚刚复制的内容。然后将Item =后面列出的表名称替换为第二个表的名称,然后按Enter。
现在,您可以与两个表进行合并:一个是最初在Navigation步骤中引入的,另一个是后来引入的(在我的示例中,引入第二个表的Applied步骤称为Custom1)。我将使用每个实例的类型,在这些实例中,我更改了类型...因此,对于第一个表,请更改类型,对于第二个表,请更改Type1。
现在,添加表1和表2: 单击“更改的Type1应用步骤”,然后单击“主页”>“追加查询”,然后从下拉列表中选择“从文件夹转换样本文件(当前)”,然后单击“确定”。
然后,在编辑栏中,将第一个#“ Changed Type1”更改为#“ Changed Type”,然后按Enter。
现在返回原始查询。我的被称为文件夹。您会看到所有电子表格及其附加表都已相互附加。
为使您了解上面完整附加的清单中看到的内容,对于其他电子表格,我添加了一个文件号。我使用约定:
F(用于文件)#T(用于表)#C(用于列)#R(用于行)#
对于Spreadsheet2,表1,列1:
F2T1C1R1
F2T1C1R2
...