以编程方式编辑Excel 2013 Powerpivot数据馈送连接

时间:2014-05-22 16:58:29

标签: c# excel powerpivot

我有一个excel 2013 powerpivot文档...连接到我托管的wcfdataservice ...数据连接工作正常,所有数据都被带回并成功填充到我的powerpivot图表/表中。

数据托管在数据Feed网址上,如下所示:

http://mydomain/Reporting/WcfDataService1.svc/

我有几十个客户,每个客户都需要收到同样的文件......但是编辑的DataFeedURL指向他们的托管数据服务......每个客户端都有不同的URL ...例如

http://Client1/Reporting/WcfDataService1.svc/ 

http://Client2/Reporting/WcfDataService1.svc/

长话短说...我希望客户使用我的C#Windows窗体应用程序,它将引用模板PowePivot报告...以及用户完成后设置有关其公司的各种信息。 ..我需要以编程方式保存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.Connection的内容,但是尝试编辑它,如下所示

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对象是只读的...但我听说其他论坛的人都在谈论能够编辑这个连接字符串,但是没有看到任何例子......任何人都知道如何编辑这个DataFeedConnection.Connection对象?

2 个答案:

答案 0 :(得分:0)

如果属性是只读的,也许您可​​以使用Reflection来强制设置它。如果有效,请告诉我:

Changing read only properties with reflection

答案 1 :(得分:0)

我一直在努力让这个工作正常,似乎由于数据连接实际存储在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();
    }
}