2011-11-21 90 views
7

我想知道如何更新现有的数据透视表数据源。我使用Microsoft.Office.Interop.Excel与Excel 2010中如何使用C#更新数据透视表数据源?

针对用户目前我能够刷新数据透视表,工作正常,但是当更多的行添加我想包括在数据透视表的数据源,这些行。例如,在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(...)一个解决方案的简化版本。但是,这不适用于我的情况,因为用户更喜欢通过更改选定的字段,行,列等来修改数据透视表。只需在数据源工作表更改时更新它。

+1

不知道为什么这是被拒绝的,似乎对我来说是一个合理的问题。 – neontapir

+0

是的,我也不确定,这不是我在MSDN或类似资源中轻松找到的那种东西。 –

回答

2

此问题的解决方案是在excel中为数据透视表数据源使用Dynamic Named Range。动态命名范围公式使用和OFFSET function的组合COUNTA function像这样:具有数据A1000:

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

上述公式将导致内A2的单元格范围。在我的情况下,我需要多个列和更大范围的行来检查数据。

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

+0

如果有其他SO用户觉得这有帮助或希望看到一个工作示例,请告诉我。 –

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",它将不起作用。