如何使用相对路径指向我希望将数据导入数据模型的文件?

时间:2017-10-16 15:38:20

标签: c# excel epplus powerquery

我真正想要实现的目标

我们有一个Excel仪表板,可以与我们内部应用程序的Export一起使用。使用EPPlus生成数据Excel文件,我们确信我们可以使用Excel仪表板作为生成的“基础”文件,以便导出的文件包含一个工作表中的仪表板和另一个工作表中的数据集。

因此用户可以在一个文件中收到他们需要的所有内容。

由于命名范围为dynamically adapt to the size of the dataset, covered here

,我们对此感到满意

但是,我们发现,由于Excel仪表板文件中的DataModel是OLAP多维数据集,我们无法更新基础数据集并使用EPPlus保存它并收到有关“缓存源不是工作表”的错误“当试图保存表格时。

因此,在我们努力实现这一目标的过程中,我们找到了一个临时解决方案......我们也遇到了障碍。

新问题

我们想到的临时解决方案是将Excel仪表板和数据分发为两个单独的Excel文件。仪表板分发给需要它的人,然后可以从我们的应用程序生成数据导出。

我们认为唯一的缺点是需要用户手动重命名数据文件并将其与Excel Dashboard并排放置。

但是,我们遇到的问题是Excel坚持使用数据文件的绝对路径而不是相对路径。

这导致要求用户手动将源指向数据导出。显然,这是以这种方式完成的:Method of updating the path to the external Excel data file

现在,我正在展示整个过程,以便对我们设置它的方式有所了解,因为我不确定我是否正在使用关于技术细节的正确词语 - 也许我是在方法上严重错误。

总体而言,它的工作方式

File A包含信息中心,部分工作表包含信息中心使用的数据透视表。数据透视表都是在上述数据模型中处理的,这是一个多维数据集(我们需要将它作为我们在数据透视表中使用的一些函数的多维数据集)。数据模型基于一个命名范围,包括其中一个工作表中的所有数据。

File B是我们的应用程序生成的。在设计仪表板和映射数据时,这两个文件并排放置,因为我的印象是Excel尽可能保留相对文件路径。该文件由一个包含导出数据的工作表组成。

此时,挑战在于自动将File B中的数据导入File A中的工作表。我这样做是通过转到数据选项卡并使用Get Data函数将其指向File B并告诉Excel加载指定工作表中的数据。

虽然“解决方案”看起来过于复杂,但这有点像魅力。 一切顺利,直到我们尝试使用另一台机器/目录中的工作表。然后我们发现File B的路径似乎是绝对的,并且无法再找到数据文件。

所以,这个冗长的解释之后的简短问题是:“当使用”获取数据“功能从外部文件导入数据时,我怎么可能让Excel使用另一个文件的相对路径?< / EM>“

1 个答案:

答案 0 :(得分:2)

通过更加熟悉Power Query,我已经能够找到解决方案。

我的设置仍然如上所述。

首先,我有一张带有一些“系统”值的工作表我在工作簿中使用了不同的位置。我在那里添加了一个字段,其中包含以下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脚本中使用。

最后,我加载了Power Query脚本,负责从其他Excel工作表加载数据。在该脚本中,我将文件的路径更改为:

Source = Excel.Workbook(File.Contents(GetValue("FilePath")), null, true),

这里要注意的一件事就是GetValue("FilePath")File.Contents的路径参数的调用。 FilePath是我给出指向单元格的范围的名称。它只是从我的工作表加载路径,并将其用作保存数据的Excel工作表的路径。

一个非常复杂的解决方案,但它确实有效。