Изменение соединения PivotCache электронной таблицы Excel в C # - PullRequest
2 голосов
/ 01 февраля 2012

Я загружаю таблицу Excel с сводными таблицами и диаграммами в ней в элемент управления веб-браузера, используя C #.Электронные таблицы имеют несколько строк подключения, все они указывают на базу данных разработки.Я хотел бы иметь возможность изменить строки подключения на те, которые были предоставлены пользователем при запуске моего приложения.

Мне уже удалось заставить это работать, когда электронная таблица была создана программно и SourceTypeиз сводных кэшей установлено значение « Внешний ».Однако при загрузке электронной таблицы, созданной в Excel, тип источника устанавливается на « База данных », и при обращении к свойству « Соединение » создаются исключения.

Есть ли способ изменить свойство SourceType (только для чтения) или строку подключения такой электронной таблицы?

Вот пример моего кода, основанный на решениипохожая проблема .

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.COME, как только я получаю доступ к Connection свойство сводного кэша.Есть идеи?

1 Ответ

1 голос
/ 23 февраля 2012

Вот исправление проблемы, основанное на решении, которое я нашел здесь .

        //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();

Это решило проблему с большинством отчетов, генерирующих исключения.Единственное, что не сработало, было воссоздано с нуля (оно было действительно старым и было вокруг блока!)

Надеюсь, это поможет другим.

...