当我不得不使用Python从PowerPivot模型中读取一些数据时,看起来像是一项微不足道的任务变成了一场真正的噩梦.我相信我在过去的几天里对此进行了很好的研究,但现在我遇到了一堵砖墙,并希望得到Python/SSAS/ADO社区的一些帮助.
基本上,我想要的是以编程方式访问存储在PowerPivot模型中的原始数据 - 我的想法是通过下面列出的方法之一连接到底层的PowerPivot(即MS Analysis Services)引擎,列出模型中包含的表,然后使用简单的DAX查询(类似EVALUATE (table_name))从每个表中提取原始数据.容易腻,对吗?好吧,也许不是.
如您所见,我尝试了几种不同的方法.我会尝试尽可能仔细地记录所有内容,以便那些不熟悉PowerPivot功能的人会很清楚我想做什么.
首先,有关编程访问Analysis Services引擎的一些背景知识(它说2005 SQL Server,但它应该仍然适用):SQL Server数据挖掘可编程性和用于Analysis Services连接的数据提供程序.
我将在下面的示例中使用的示例Excel/PowerPivot文件可以在此处找到:Microsoft PowerPivot for Excel 2010和Excel 2013示例中的PowerPivot.
另请注意,我使用的是Excel 2010,因此我的一些代码是特定于版本的.例如,wb.Connections["PowerPivot Data"].OLEDBConnection.ADOConnection应该是wb.Model.DataModelConnection.ModelConnection.ADOConnection,如果你使用Excel 2013.
我将在整个问题中使用的连接字符串基于以下信息:使用C#连接到PowerPivot引擎.另外,一些方法显然需要在数据检索之前对PowerPivot模型进行某种初始化.请参见此处:从VBA自动执行PowerPivot Refresh操作.
最后,这里有几个链接显示这应该是可以实现的(但请注意,这些链接主要是指C#,而不是Python):
Interop.ADODB.dll集,我猜它是用于访问PowerPivot数据的内容)import clr
clr.AddReference("Microsoft.AnalysisServices.AdomdClient")
import Microsoft.AnalysisServices.AdomdClient as ADOMD
ConnString = "Provider=MSOLAP;Data Source=$Embedded$;Locale Identifier=1033;
Location=H:\\PowerPivotTutorialSample.xlsx;SQLQueryMode=DataKeys"
Connection = ADOMD.AdomdConnection(ConnString)
Connection.Open()
Run Code Online (Sandbox Code Playgroud)
在这里,似乎问题是PowerPivot模型尚未初始化:
AdomdConnectionException: A connection cannot be …Run Code Online (Sandbox Code Playgroud)