2011-11-21 32 views
7

Varolan bir pivot tablo veri kaynağının nasıl güncelleneceğini bilmek istiyorum. Microsoft.Office.Interop.Excel kullanıyorum ve kullanıcıları Excel 2010 ile hedefliyorum.C# kullanarak Özet Tablo veri kaynağı nasıl güncellenir?

Şu anda iyi çalışan pivot tabloyu yenileyebilirim, ancak daha fazla satır eklendiğinde, bu satırları pivot tablo veri kaynağına eklemek istiyorum. Örneğin, Excel'de görüntülendiğinde pivot tablo veri kaynağı, DataSourceWorksheet!$A$2:$U$26'dur ve güncelleme/yenileme excel dosya kodumun çalıştırılmasından sonra DataSourceWorksheet!$A$2:$U$86 (60 daha fazla satır) olarak değiştirilmesini istiyorum.

İşte benim kod

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) */ 

sadece wrkBook.PivotTableWizard(...) kullanarak tekrar özet tablo yenilemek için olacağını, çalışabilir bir çözüm basitleştirilmiş versiyonu. Ancak, bu durum benim durumum için çalışmayacaktır çünkü kullanıcılar seçilen alanları, satırları, sütunları vb. Değiştirerek pivot tablolarını değiştirmeyi tercih edecektir. Veri kaynağı çalışma sayfası değiştiğinde sadece güncellenmesi gerekir.

+1

Bunun neden oylandığından emin değilim, bana makul bir soru gibi görünüyor. – neontapir

+0

Evet, emin değilim, bu, MSDN'de veya benzer kaynaklarda kolayca bulduğum bir şey değil. –

cevap

2

Bu sorunun çözümü, Pivot Tablo veri kaynağı için bir excel olarak Dynamic Named Range kullanmaktı. veri A1000:

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

Yukarıdaki formül A2 içinde bir hücre aralığı neden olur: Dinamik adlı sınıf Formül OFFSET function bir kombinasyonunu ve bu gibi COUNTA function kullanır. Benim durumumda birden fazla sütuna ihtiyacım vardı ve veri için 'kontrol etmek' için daha fazla satır aralığı istiyorum. Ben sadece sadece dize değerini geçmesi

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

ve yeni pivot tablo oluştururken sonra veri kaynağı olarak adlandırılmış aralık belirtmek için:

Şimdi adlandırılmış bir aralık oluşturmak için C# aşağıdaki kullanılan PivotTableWizard yöntem haline aralık adı:

satırlar özet tablo sadece adlandırılmış aralık kullanarak veri değerleri ile hücreleri referans olacak DataSourceWorkSheet içinde eklenen veya silinen Şimdi
//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 
        ); 

. beklendiği gibi şimdi pivot tablo yenilemek sadece RefreshTable arayarak, çalışır:

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

pivot.RefreshTable(); 

Genel olarak, bu varolan çalışma kitabını yeni bir excel çalışma kitabı oluşturmak veya güncellemek için bir yöntem dahilinde olmayacaktı. Mevcut bir çalışma kitabı için bu yöntemin çağrılması, şimdi mevcut pivot tablonun bir dinamik adlandırılmış aralık kullanılarak yaratıldığına ve buna göre güncelleneceğine dayanmaktadır.

+0

Başka bir SO kullanıcısı bunu faydalı buluyorsa veya çalışan bir örnek görmek istiyorsa, bildirin. –

5

onun çok basit .. İşte tüm ..

hatırla

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

, her zaman Row ve Sütun biçimini vermek gerekir.

E.g. böyle

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

yani "SheetName!R1C1:R12C13".

"SheetName!$A$1:$Q$18"'u böyle verirseniz, çalışmaz.

İlgili konular