在C#中更改Excel电子表格的PivotCache连接

时间:2012-02-01 16:11:45

标签: c# .net excel ms-office

我正在使用C#将带有数据透视表和图表的Excel电子表格加载到Web浏览器控件中。电子表格有几个连接字符串,都指向开发数据库。我希望能够将连接字符串更改为在运行我的应用程序时由用户提供的连接字符串。

当电子表格以编程方式创建并且数据透视缓存的SourceType设置为“外部”时,我已设法使其正常工作。但是,当加载在Excel中创建的电子表格时,源类型将设置为“数据库”,并且在访问“连接”属性时会抛出异常。

有没有办法更改SourceType(只读)属性或此类电子表格的连接字符串?

以下是我的代码示例,该示例基于a solution to a similar problem

EXCEL.Worksheet sheet = (EXCEL.Worksheet)_application.ActiveSheet;
foreach (EXCEL.PivotTable table in sheet.PivotTables())
{
      table.PivotCache().Connection = ConnectionString;
      table.RefreshTable();
}

我也试过这个

var workBooks = _application.Workbooks.Cast<EXCEL.Workbook>();
var pivotCaches = workBooks.SelectMany(arg => GetPivotCaches(arg));

foreach (EXCEL.PivotCache cache in pivotCaches)
{
    cache.Connection = ConnectionString;
}

在这两种情况下,只要访问数据透视缓存的连接属性,我就会收到System.Runtime.InteropServices.COMException。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

以下是基于I found here

的解决方案解决问题的方法
        //update the connections
        foreach (EXCEL.WorkbookConnection connection in workbook.Connections)
        {
            if (connection.Type.ToString() == "xlConnectionTypeODBC")
            {
                connection.ODBCConnection.BackgroundQuery = false;
                connection.ODBCConnection.Connection = ConnectionString;
            }
            else
            {
                connection.OLEDBConnection.BackgroundQuery = false;
                connection.OLEDBConnection.Connection = ConnectionString;
            }
        }

        //Refresh all data
        workbook.RefreshAll();

这解决了大多数抛出异常的报告的问题。唯一一个不起作用的是从头开始重新创建(它真的很老了,已经在街区了!)

希望这有助于其他人。