如何使用相对路径指向我希望将数据从中导入数据模型的文件?
How do I use a relative path to point to a file from which I wish to import data to my Data Model?
我真正想要实现的目标
我们有一个 Excel 仪表板,它与我们的 in-house 应用程序的导出一起使用。数据 Excel 文件的生成是使用 EPPlus 完成的,我们确信我们可以使用 Excel 仪表板作为生成的 "base" 文件,以便导出的文件包含仪表板在一项工作中sheet 和在另一项工作中的数据集sheet.
因此用户将在一个文件中收到他们需要的一切。
多亏了
但是,我们发现,由于 Excel 仪表板文件中的 DataModel 是一个 OLAP 多维数据集,我们无法更新基础数据集并使用 EPPlus 保存它并收到有关 "the cache source is not a worksheet" 试图保存 sheet.
因此,在我们努力解决这个问题的同时,我们找到了一个临时解决方案...我们也遇到了障碍。
新问题
我们想到的临时解决方案是将 Excel 仪表板和数据作为两个单独的 Excel 文件分发。仪表板分发给需要它的人,然后可以从我们的应用程序生成数据导出。
我们认为这样做的唯一缺点是需要用户手动重命名数据文件并将其与 Excel 仪表板并排放置。
但是,我们 运行 遇到了 Excel 坚持使用数据文件的绝对路径而不是相对路径的问题。
这导致要求用户手动将源指向数据导出。显然,这是这样做的:
现在,我将展示整个过程,以便让您深入了解我们的设置方式,因为我不确定我对技术细节使用的词语是否正确 - 也许我我的方法大错特错。
总的来说,它的工作方式
File A
包含仪表板,一些 sheet 包含仪表板使用的数据透视表。数据透视表都是基于前面提到的 sheet 中的数据模型工作的,它是一个多维数据集(对于我们在数据透视表中使用的某些函数,我们需要它是一个多维数据集)。数据模型基于命名范围,包括其中一项工作sheets.
中的所有数据
File B
是由我们的应用程序生成的。在设计仪表板和映射数据时,这两个文件并排放置,因为我的印象是 Excel 试图尽可能保留相对文件路径。该文件包含一个包含导出数据的作品sheet。
此时,挑战是自动将数据从 File B
拉入 File A
的工作 sheet 中。我通过转到“数据”选项卡并使用 Get Data
函数将其指向 File B
并告诉 Excel 从指定的 sheet.[=19 加载数据来完成此操作=]
尽管 "solution" 看起来过于复杂,但它的效果非常好。
一切都很好,直到我们尝试使用另一个 machine/directory 的 sheet。然后我们发现File B
的路径好像是绝对路径,数据文件已经找不到了
因此,long-winded 解释之后的简短问题是:“当从外部导入数据时,我怎么可能 Excel 使用另一个文件的相对路径使用 "Get Data" 函数的文件?"
通过更加熟悉 Power Query,我已经能够想出一个解决方案。
我的设置仍然如上所述。
首先,我有一个 sheet 和一些 "system" 值,我在工作簿的各个地方使用。我在那里添加了一个字段,其中包含以下 Excel 公式:
=LEFT(CELL("filename");FIND("[";CELL("filename");1)-1)
这为我提供了 File A
所在文件夹的绝对路径。
我使用这个值,并连接保存数据的 File B
的预期文件名。结果是一个绝对路径,指向我希望数据文件所在的位置。
然后我添加了一个名称范围,指向包含该值的确切单元格。
接下来,我像这样添加了一个新的 Power Query 函数:
= (rangeName) => Excel.CurrentWorkbook(){[Name=rangeName]}[Content]{0}[Column1]
该函数将命名范围的名称作为参数并吐出值。在我的例子中,我调用了函数 GetValue
。此函数现在可以在其他 Power Query 脚本中使用。
最后,我加载了负责从另一个 Excel sheet 加载数据的 Power Query 脚本。在该脚本中,我将文件的路径更改为:
Source = Excel.Workbook(File.Contents(GetValue("FilePath")), null, true),
这里要注意的一件事是GetValue("FilePath")
对File.Contents
的路径参数的调用。 FilePath
是我给指向单元格的范围命名的。它所做的就是从我的 sheet 加载路径并将其用作保存数据的 Excel sheet 的路径。
一个非常复杂的解决方案,但它有效。
我真正想要实现的目标
我们有一个 Excel 仪表板,它与我们的 in-house 应用程序的导出一起使用。数据 Excel 文件的生成是使用 EPPlus 完成的,我们确信我们可以使用 Excel 仪表板作为生成的 "base" 文件,以便导出的文件包含仪表板在一项工作中sheet 和在另一项工作中的数据集sheet.
因此用户将在一个文件中收到他们需要的一切。
多亏了
但是,我们发现,由于 Excel 仪表板文件中的 DataModel 是一个 OLAP 多维数据集,我们无法更新基础数据集并使用 EPPlus 保存它并收到有关 "the cache source is not a worksheet" 试图保存 sheet.
因此,在我们努力解决这个问题的同时,我们找到了一个临时解决方案...我们也遇到了障碍。
新问题
我们想到的临时解决方案是将 Excel 仪表板和数据作为两个单独的 Excel 文件分发。仪表板分发给需要它的人,然后可以从我们的应用程序生成数据导出。
我们认为这样做的唯一缺点是需要用户手动重命名数据文件并将其与 Excel 仪表板并排放置。
但是,我们 运行 遇到了 Excel 坚持使用数据文件的绝对路径而不是相对路径的问题。
这导致要求用户手动将源指向数据导出。显然,这是这样做的:
现在,我将展示整个过程,以便让您深入了解我们的设置方式,因为我不确定我对技术细节使用的词语是否正确 - 也许我我的方法大错特错。
总的来说,它的工作方式
File A
包含仪表板,一些 sheet 包含仪表板使用的数据透视表。数据透视表都是基于前面提到的 sheet 中的数据模型工作的,它是一个多维数据集(对于我们在数据透视表中使用的某些函数,我们需要它是一个多维数据集)。数据模型基于命名范围,包括其中一项工作sheets.
File B
是由我们的应用程序生成的。在设计仪表板和映射数据时,这两个文件并排放置,因为我的印象是 Excel 试图尽可能保留相对文件路径。该文件包含一个包含导出数据的作品sheet。
此时,挑战是自动将数据从 File B
拉入 File A
的工作 sheet 中。我通过转到“数据”选项卡并使用 Get Data
函数将其指向 File B
并告诉 Excel 从指定的 sheet.[=19 加载数据来完成此操作=]
尽管 "solution" 看起来过于复杂,但它的效果非常好。
一切都很好,直到我们尝试使用另一个 machine/directory 的 sheet。然后我们发现File B
的路径好像是绝对路径,数据文件已经找不到了
因此,long-winded 解释之后的简短问题是:“当从外部导入数据时,我怎么可能 Excel 使用另一个文件的相对路径使用 "Get Data" 函数的文件?"
通过更加熟悉 Power Query,我已经能够想出一个解决方案。
我的设置仍然如上所述。
首先,我有一个 sheet 和一些 "system" 值,我在工作簿的各个地方使用。我在那里添加了一个字段,其中包含以下 Excel 公式:
=LEFT(CELL("filename");FIND("[";CELL("filename");1)-1)
这为我提供了 File A
所在文件夹的绝对路径。
我使用这个值,并连接保存数据的 File B
的预期文件名。结果是一个绝对路径,指向我希望数据文件所在的位置。
然后我添加了一个名称范围,指向包含该值的确切单元格。
接下来,我像这样添加了一个新的 Power Query 函数:
= (rangeName) => Excel.CurrentWorkbook(){[Name=rangeName]}[Content]{0}[Column1]
该函数将命名范围的名称作为参数并吐出值。在我的例子中,我调用了函数 GetValue
。此函数现在可以在其他 Power Query 脚本中使用。
最后,我加载了负责从另一个 Excel sheet 加载数据的 Power Query 脚本。在该脚本中,我将文件的路径更改为:
Source = Excel.Workbook(File.Contents(GetValue("FilePath")), null, true),
这里要注意的一件事是GetValue("FilePath")
对File.Contents
的路径参数的调用。 FilePath
是我给指向单元格的范围命名的。它所做的就是从我的 sheet 加载路径并将其用作保存数据的 Excel sheet 的路径。
一个非常复杂的解决方案,但它有效。