如何使用相对path指向要将数据导入到我的数据模型的文件?

我真的想要达到什么

我们有一个Excel仪表板,它与我们的内部应用程序导出一起使用。 数据Excel文件的生成是用EPPlus完成的,我们相信我们可以使用Excel仪表板作为生成的“基本”文件,这样导出的文件将仪表板包含在一个工作表中,并将数据集包含在另一个工作表中。

所以用户可以在一个文件中获得他们所需要的一切。

我们有这样的感谢命名的范围, dynamic适应数据集的大小,这里覆盖

但是,我们发现,由于Excel仪表板文件中的DataModel是OLAP多维数据集,因此我们无法更新基础数据集并使用EPPlus进行保存,并在尝试使用“caching源不是工作表”时收到错误保存表格。

所以当我们做这件事的时候,我们find了一个临时的解决scheme,我们也遇到了一些麻烦。

新的问题

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

我们认为唯一的缺点是需要用户手动重命名数据文件并将其与Excel仪表板放在一起。

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

这导致要求用户手动将源指向数据导出。 这显然是这样做的: 更新到外部Excel数据文件路径的方法

现在,我正在展示整个过程,并对我们设置的方式进行了一些了解,因为我不确定我是否正确地使用了有关技术细节的信息 – 也许我大错特错了该方法。

总的来说,它的工作方式

File A包含仪表板,一些带有仪表板使用的数据透视表的表单。 数据透视表都是在前面提到的数据模型中使用的,它是一个Cube(我们需要它是我们在数据透视表中使用的一些函数的一个立方体)。 数据模型基于命名范围,包括工作表中的所有数据。

File B是由我们的应用程序生成的。 在devise仪表板和映射数据时,两个文件并排放置,因为我曾经试图在可能的情况下保留相对文件path。 该文件由包含导出数据的单个工作表组成。

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

尽pipe“解决scheme”看起来过于复杂,但它起到了魅力的作用。 一切都很好,直到我们试图从另一台机器/目录使用表。 然后,我们发现File B的path似乎是绝对的,并且数据文件不能再被find。

因此,这个冗长的解释之后的简短问题是:“ 如何使用”获取数据“function从外部文件导入数据时,Excel可能使用相对path指向另一个文件?

通过熟悉Power Query,我已经能够想出一个解决scheme。

我的设置仍然如上所述。

首先,我在工作簿中使用了一些具有“系统”值的工作表。 我用下面的Excel公式添加了一个字段:

 =LEFT(CELL("filename");FIND("[";CELL("filename");1)-1) 

这为我提供了File A所在文件夹的绝对path。 我使用这个值,并连接保存数据的File B的预期文件名。 结果是绝对path,指向我期望数据文件的位置。

然后我添加了一个名字范围,指向包含这个值的确切单元格。

接下来,我添加了一个新的Power Queryfunction,如下所示:

 = (rangeName) => Excel.CurrentWorkbook(){[Name=rangeName]}[Content]{0}[Column1] 

该函数将命名范围的名称作为参数,并将该值返回。 我的情况我叫GetValue函数。 现在可以在其他Power Query脚本中使用此function。

最后,我加载了Power Query脚本,这个脚本负责从其他Excel工作表中加载数据。 在那个脚本中,我改变了文件的path:

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

在这里需要注意的一点是GetValue("FilePath")File.Contents的path参数的File.ContentsFilePath是我给范围指向单元格的名称。 它所做的就是从我的工作表加载path,并将其用作保存数据的Excel工作表的path。

一个相当复杂的解决scheme,但它的工作原理。