如何使用C#更新数据透视表数据源?

时间:2011-11-21 18:30:51

标签: c# excel-interop

我想知道如何更新现有的数据透视表数据源。我正在使用Microsoft.Office.Interop.Excel并使用Excel 2010定位用户。

我目前能够刷新数据透视表工作正常,但是当添加更多行时,我想在数据透视表数据源中包含这些行。例如,在Excel中查看时数据透视表数据源为DataSourceWorksheet!$A$2:$U$26,我希望在更新/刷新Excel文件代码运行后将其更改为DataSourceWorksheet!$A$2:$U$86(另外60行)。

这是我的代码的简化版本

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 个答案:

答案 0 :(得分:5)

非常简单..

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

多数人..

请记住,我们总是需要提供行和列格式。

E.g。

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

"SheetName!R1C1:R12C13"就是这样。

如果您这样提供"SheetName!$A$1:$Q$18",则无效。

答案 1 :(得分:2)

此问题的解决方案是在Excel中使用Dynamic Named Range作为数据透视表数据源。动态命名范围公式使用OFFSET functionCOUNTA function的组合,如下所示:

=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 );

然后在创建新数据透视表时指定命名范围作为数据源我只需将范围名称的字符串值传递给数据透视表方法:

//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工作簿或更新现有工作簿的方法中发生。现在为现有工作簿调用此方法依赖于现有数据透视表是使用动态命名范围创建的事实,并将相应地更新。