Как обновить источник данных сводной таблицы с помощью C #? - PullRequest
7 голосов
/ 21 ноября 2011

Я хотел бы знать, как обновить существующий источник данных сводной таблицы. Я использую Microsoft.Office.Interop.Excel и нацеливаюсь на пользователей с помощью Excel 2010.

В настоящее время я могу обновить сводную таблицу, которая работает нормально, однако, когда добавляется больше строк, я хочу включить эти строки в источник данных сводной таблицы. Например, источником данных сводной таблицы при просмотре в Excel является DataSourceWorksheet!$A$2:$U$26, и я хотел бы изменить его на DataSourceWorksheet!$A$2:$U$86 (еще 60 строк) после выполнения моего кода файла обновления / обновления Excel.

Вот упрощенная версия моего кода

Application excelApplication = new Application();
Workbooks workbooks = excelApplication.Workbooks;
wrkBook = workbooks.Open(EXCEL_DOCUMENT_PATH, Missing.Value, false, Missing.Value,
                    Missing.Value, Missing.Value, Missing.Value, Missing.Value,
                    Missing.Value, true, Missing.Value, Missing.Value,
                    Missing.Value, Missing.Value, Missing.Value);

/* update data source worksheet code here (omitted for example) */

Worksheet pivotWorkSheet = (Worksheet)wrkBook.Sheets[PIVOT_SHEET_NAME];
PivotTable pivot = (PivotTable)pivotWorkSheet.PivotTables(pivotTableName); 

/* I would like to update the pivot tables data source here...

   I could use Range object from data source worksheet...

   Basically just want to tell pivot table, use these cells now... */

pivot.RefreshTable();

/* cleanup code here (omitted for example) */

Решением, которое может сработать, было бы просто заново создать сводную таблицу, используя wrkBook.PivotTableWizard( ... ). Однако в моей ситуации это не сработает, поскольку пользователи предпочитают изменять свою сводную таблицу, изменяя выбранные поля, строки, столбцы и т. Д. Ее просто необходимо обновить при изменении таблицы источника данных.

Ответы [ 2 ]

5 голосов
/ 19 марта 2012

это очень просто ..

pivot.SourceData = "SheetName!R1C1:R18C18"
pivot.RefreshTable();

Вот и все ..

Помните, всегда нужно указывать формат строки и столбца.

1008 * Е.Г. *

"SheetName!" + R + Rowstartingnumber + C + Column StartingNumber  : R + Rowendnumber + C + Column Endnumber.

т.е. "SheetName!R1C1:R12C13" вот так.

Если вы дадите "SheetName!$A$1:$Q$18" таким образом, оно не будет работать.

2 голосов
/ 29 ноября 2011

Решением этой проблемы было использование динамического именованного диапазона в Excel для источника данных сводной таблицы. Формула динамического именованного диапазона использует комбинацию функции OFFSET и функции COUNTA следующим образом:

=OFFSET(DataSourceWorksheet!$A$2,0,0,COUNTA(DataSourceWorksheet!$A$2:$A$1000),1)

Приведенная выше формула приведет к диапазону ячеек в A2: A1000, которые имеют данные. В моем случае мне потребовалось более одного столбца, и я увеличил диапазон строк, чтобы «проверить» данные.

Теперь в C # для создания именованного диапазона я использовал следующее:

Names wrkBookNames = wrkBook.Names;
string dynamicRangeFormula = "=OFFSET(DataSourceWorksheet!$A$2,0,0,COUNTA(DataSourceWorksheet!$A$2:$A$1000),1)";
wrkBookNames.Add("MyNamedRange", dynamicRangeFormula );

и затем, чтобы указать этот именованный диапазон в качестве источника данных при создании новой сводной таблицы, я просто передаю строковое значение имени диапазона в метод PivotTableWizard:

//get range for pivot table destination
Range pivotDestinationRange = pivotWorkSheet.get_Range("A1", Type.Missing);

wrkBook.PivotTableWizard(
                    XlPivotTableSourceType.xlDatabase,
                    "MyNamedRange",
                    pivotDestinationRange,
                    pivotTableName,
                    true,
                    true,
                    true,
                    true,
                    Type.Missing,
                    Type.Missing,
                    false,
                    false,
                    XlOrder.xlDownThenOver,
                    0,
                    Type.Missing,
                    Type.Missing
                    );

Теперь, когда строки добавляются или удаляются в DataSourceWorkSheet, сводная таблица будет ссылаться только на ячейки со значениями данных, используя именованный диапазон. Обновление сводной таблицы теперь работает как положено, вызывая RefreshTable:

PivotTable pivot = (PivotTable)pivotWorkSheet.PivotTables(pivotTableName); 

pivot.RefreshTable();

В целом, это будет происходить в методе создания новой рабочей книги Excel или обновления существующей рабочей книги. Вызов этого метода для существующей рабочей книги теперь зависит от того факта, что существующая сводная таблица была создана с использованием динамического именованного диапазона и будет соответствующим образом обновлена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...