以编程方式编辑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 2013 Powerpivot数据馈送连接

如果属性是只读的,也许你可以使用反射来强制设置它。让我知道这是否有效:

使用反射修改只读属性

我一直试图得到这个工作以及,似乎由于数据连接实际上存储在嵌入在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();
    }
}