2011-11-21 124 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",它將不起作用。