将文件夹中的特定文件加载到工作簿中的不同工作表

时间:2018-10-11 12:03:17

标签: excel powerquery

我试图将VBA宏代码转换为功率查询,但现在看起来像卡住了。 我有一个文件夹,最多可以包含4个文件。 3个具有.dat扩展名,1个具有.txt扩展名。我想要实现的是将所有扩展名为.dat的文件加载到不同的工作表中。我尝试了两种方法。

方法之一-单个查询中的所有内容

1)获取文件夹中的所有文件

GetFiles = Folder.Files("FolderPath"),

2)过滤扩展名为.dat的文件

FilterFiles = Table.SelectRows(GetFiles, each ([Extension] = ".dat")),

3)添加一个包含filePath和fileName的列

BuildFilePath = Table.AddColumn(FilterFiles, "FilePath", each [Folder Path] & [Name]),

4)检查3个文件中的哪个可用

    Tab1 = Table.SelectRows(BuildFilePath , each Text.Contains([Name], "Tab1")),
    Tab2 = Table.SelectRows(BuildFilePath , each Text.Contains([Name], "Tab2")),
    Tab3 = Table.SelectRows(BuildFilePath , each Text.Contains([Name], "Tab3")),

    HasTab1 = Table.RowCount(Tab1),
    Tab1Content = if HasTab1 > 0 then Csv.Document(File.Contents(Tab1[FilePath]{0}), null, "~") else "",

    HasTab2 = Table.RowCount(Tab2),
    Tab2Content = if HasTab2 > 0 then Csv.Document(File.Contents(Tab2[FilePath]{0}), null, "~") else "",

    HasTab3 = Table.RowCount(Tab3),
    Tab3Content = if HasTab3 > 0 then Csv.Document(File.Contents(Tab3[FilePath]{0}), null, "~") else "",

对于这种方法,我在查询步骤中加载了文件内容,但是我仍然不知道如何将它们输出到不同的工作表中。

采用两种方法-模块化的,用于处理不同事情的单独文件

1)查询GetFiles

AllFiles = Folder.Files(FolderPath)

2)查询过滤文件

AllFiles = GetFiles,
FilterFiles = Table.SelectRows(AllFiles, each ([Extension] = ".dat"))

3)查询BuildFilePath

FilteredFiles = FilterFiles,
BuildFilePath = Table.AddColumn(FilteredFiles, "FilePath", each [Folder Path] & [Name])

4)查询文件是否存在

FileExists = (TabName, FileTable) =>
    let
        TabRow = Table.SelectRows(FileTable, each Text.Contains([Name], TabName)),
        RowCount = Table.RowCount(TabRow),
        HasFile = if RowCount > 0 then TabRow[FilePath]{0} else "false"
in
    HasFile

5)查询LoadTab1

Source = BuildFilePath,
FilePath = FileExists("Tab1", BuildFilePath),
LoadFile = if FilePath <> "false" then Csv.Document(File.Contents(FilePath), null, "~") else ""

在这一步中我遇到了错误

  

Formula.Firewall:查询“ LoadTab1”(步骤“ LoadFile”)引用   其他查询或步骤,因此它可能不会直接访问数据源。   请重建此数据组合。

我也只想加载文件而不是中间表

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:0)

每个查询都加载一个单独的工作表,因此您需要三个查询:

let
Source = "",
GetFiles = Folder.Files("FolderPath"),
FilterFiles = Table.SelectRows(GetFiles, each ([Extension] = ".dat")),
BuildFilePath = Table.AddColumn(FilterFiles, "FilePath", each [Folder Path] & [Name]),
Tab1 = Table.SelectRows(BuildFilePath , each Text.Contains([Name], "Tab1")),
HasTab1 = Table.RowCount(Tab1),
Tab1Content = if HasTab1 > 0 then Csv.Document(File.Contents(Tab1[FilePath]{0}), null, "~") else ""
in
Tab1Content

let
Source = "",
GetFiles = Folder.Files("FolderPath"),
FilterFiles = Table.SelectRows(GetFiles, each ([Extension] = ".dat")),
BuildFilePath = Table.AddColumn(FilterFiles, "FilePath", each [Folder Path] & [Name]),
Tab2 = Table.SelectRows(BuildFilePath , each Text.Contains([Name], "Tab2")),
HasTab2 = Table.RowCount(Tab2),
Tab2Content = if HasTab2 > 0 then Csv.Document(File.Contents(Tab2[FilePath]{0}), null, "~") else ""
in
Tab2Content

let
Source = "",
GetFiles = Folder.Files("FolderPath"),
FilterFiles = Table.SelectRows(GetFiles, each ([Extension] = ".dat")),
BuildFilePath = Table.AddColumn(FilterFiles, "FilePath", each [Folder Path] & [Name]),
Tab3 = Table.SelectRows(BuildFilePath , each Text.Contains([Name], "Tab3")),
HasTab3 = Table.RowCount(Tab3),
Tab3Content = if HasTab3 > 0 then Csv.Document(File.Contents(Tab3[FilePath]{0}), null, "~") else ""
in
Tab3Content

关闭并加载查询编辑器时,它将创建3个电子表格...每个标签文件一个。

答案 1 :(得分:0)

然后,您可能想尝试一个功能。类似于此函数,我将其命名为 GetTab

let
Source = (TabName) => 
let
GetFiles = Folder.Files("FolderPath"),
FilterFiles = Table.SelectRows(GetFiles, each ([Extension] = ".dat")),
BuildFilePath = Table.AddColumn(FilterFiles, "FilePath", each [Folder Path] & [Name]),
Tab = Table.SelectRows(BuildFilePath , each Text.Contains([Name], TabName)),
HasTab = Table.RowCount(Tab),
TabContent = if HasTab > 0 then Csv.Document(File.Contents(Tab[FilePath]{0}), null, "~") else ""
in
TabContent
in
Source

然后我从另外三个单独的查询中调用:

let
TabName = Function.Invoke(GetTab,{"Tab1"})
in
TabName

let
TabName = Function.Invoke(GetTab,{"Tab2"})
in
TabName

let
TabName = Function.Invoke(GetTab,{"Tab3"})
in
TabName

答案 2 :(得分:0)

也许这个...

从查询的一部分开始,该部分将文件夹信息作为自己的查询。 (如果将其设置为仅加载为连接,则不会创建电子表格。)我将其命名为 GetFolderInfo

let
GetFiles = Folder.Files("FolderPath"),
FilterFiles = Table.SelectRows(GetFiles, each ([Extension] = ".dat")),
BuildFilePath = Table.AddColumn(FilterFiles, "FilePath", each [Folder Path] & [Name])
in
BuildFilePath

(用上面的实际文件夹路径替换上面查询中的“ FolderPath” ,以\结束,并用引号引起来。例如:“ C:\ mypath \”。)

然后创建一个引用GetFolderInfo查询的函数。就像我先前的答案一样,我称这个为 GetTab

let
Source = (TabName) => 
let
Tab = Table.SelectRows(GetFolderInfo, each Text.Contains([Name], TabName)),
HasTab = Table.RowCount(Tab),
TabContent = Tab{[#"Folder Path"="FolderPath",Name=TabName&".dat"]}[Content],
ToCSV = if HasTab > 0 then Csv.Document(TabContent) else ""
in
ToCSV
in
Source

(在上面的函数中,将“ FolderPath” 替换为您的实际文件夹路径,以\结尾,并用引号引起来。例如:“ C:\ mypath \”。请勿更改# “文件夹路径” 。)

然后从三个单独的查询中调用GetTab函数,就像我之前的答案一样。

let
TabName = Function.Invoke(GetTab,{"Tab1"})
in
TabName

let
TabName = Function.Invoke(GetTab,{"Tab2"})
in
TabName

let
TabName = Function.Invoke(GetTab,{"Tab3"})
in
TabName
相关问题