以编程方式编辑Excel 2013 Powerpivot数据馈送连接
本文关键字:数据 连接 Powerpivot 2013 编程 方式 编辑 Excel | 更新日期: 2023-09-27 18:04:43
我有一个excel 2013 powerpivot文档…它连接到我托管的wcfdataservice…数据连接工作正常,所有数据都被带回并成功地填充到我的powerpivot图表/表格中。
数据托管在数据提要URL上,如下所示:
http://mydomain/Reporting/WcfDataService1.svc/
我有几十个客户,每个客户都需要收到同样的文件…但是将DataFeedURL编辑为指向他们的托管数据服务…每个都有不同的URL…例如
http://Client1/Reporting/WcfDataService1.svc/
http://Client2/Reporting/WcfDataService1.svc/
长话短说……我希望客户使用我的c# Windows窗体应用程序,它将引用模板powerpivot报表…当用户完成了关于他们公司的各种信息设置后……我需要以编程方式保存PowerPivot报告的一个版本,该版本包含到我生成的新URL的更新连接。
我试图这样做:
string workbookPath = String.Format("{0}''{1}", Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "PowerPivotSource.xlsx");
string workbookPath2 = String.Format("{0}''{1}", Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "PowerPivotTestOut.xlsx");
foreach (Excel.WorkbookConnection connection in excelWorkbook.Connections)
{
if (connection.Type == Excel.XlConnectionType.xlConnectionTypeDATAFEED)
{
Excel.DataFeedConnection dataFeedCur = connection.DataFeedConnection;
dataFeedCur.Connection = dataFeedCur.Connection.Replace("mydomain", "Client1");
break;
}
}
excelWorkbook.Close(true);
我可以读取dataFeedCur的内容。连接,但试图编辑它,如下所示
dataFeedCur.Connection = dataFeedCur.Connection.Replace("localhost", "Client1");
抛出以下异常:
Exception Message: "Exception from HRESULT: 0x800A03EC"
Exception Stack Trace: "" at System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)'r'n at Microsoft.Office.Interop.Excel.DataFeedConnection.set_Connection(Object value)'r'n
有一些迹象表明WorkBookConnection。DataFeedConnection对象是Read Only…但我听到人们在其他论坛谈论能够编辑这个连接字符串,但没有看到任何例子…有人知道这个DataFeedConnection是怎么回事吗?可以编辑连接对象吗?
如果属性是只读的,也许你可以使用反射来强制设置它。让我知道这是否有效:
使用反射修改只读属性
我一直试图得到这个工作以及,似乎由于数据连接实际上存储在嵌入在excel文件内的SSAS立方体,这就是为什么发生错误。然而,我能够在SharePoint的帮助下完成这个工作,并在powerpivot支持下正确设置它。
下面是我的代码:using Microsoft.AnalysisServices;
using Microsoft.AnalysisServices.SPClient;
using Microsoft.AnalysisServices.SPClient.Interfaces;
string workbookUrl = "http://sharepoint/Shared%20Documents/spbook.xlsx";
using (IWorkbookSession workbookSession = ASSPClientProxy.OpenWorkbookModel(workbookUrl))
{
bool hasEmbeddedModel = (workbookSession.Database != null);
if (hasEmbeddedModel && workbookSession.WorkbookFormatVersion == WorkbookFileFormat.Excel2013)
{
using (Server ssas = new Server())
{
ssas.Connect("Data Source=" + workbookSession.Server);
Database database = ssas.Databases.FindByName(workbookSession.Database);
foreach (DataSource dataSource in database.DataSources)
{
dataSource.ConnectionString = dataSource.ConnectionString.Replace("parameter1", "parameter2");
dataSource.Update();
dataSource.Refresh();
}
}
workbookSession.RefreshEmbeddedModel();
workbookSession.Save();
}
}