2011-11-21 12 views
7

Vorrei sapere come aggiornare un'origine dati della tabella pivot esistente. Sto usando Microsoft.Office.Interop.Excel e indirizzato agli utenti con Excel 2010.Come aggiornare l'origine dati di tabella pivot usando C#?

Attualmente sono in grado di aggiornare la tabella pivot che funziona correttamente, tuttavia quando vengono aggiunte più righe, desidero includere queste righe nell'origine dati della tabella pivot. Ad esempio, l'origine dati della tabella pivot quando viene visualizzata in Excel è DataSourceWorksheet!$A$2:$U$26 e vorrei che fosse cambiata in DataSourceWorksheet!$A$2:$U$86 (altre 60 righe) dopo l'esecuzione del mio codice file di aggiornamento/aggiornamento.

Ecco una versione semplificata del mio codice

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

Una soluzione che può funzionare, sarebbe solo per rigenerare la tabella pivot utilizzando nuovamente wrkBook.PivotTableWizard(...). Tuttavia, questo non funzionerà per la mia situazione dato che gli utenti preferirebbero modificare la loro tabella pivot modificando campi, righe, colonne, ecc. Selezionati. È sufficiente aggiornarli quando cambia il foglio di lavoro delle origini dati.

+1

Non so perché questo è stato votato in basso, mi sembra una domanda ragionevole. – neontapir

+0

Sì, non sono nemmeno sicuro, questo non è il tipo di cosa che ho trovato facilmente su MSDN o in risorse simili. –

risposta

2

La soluzione a questo problema era utilizzare un Dynamic Named Range in Excel per l'origine dati Tabella pivot. La formula intervallo denominato dinamica utilizza una combinazione di OFFSET function e COUNTA function modo:

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

formula sopra si tradurrà in un intervallo di celle all'interno A2: A1000 che hanno dati. Nel mio caso ho richiesto più di una colonna e ho un maggior intervallo di righe per "verificare" i dati.

Ora in C# per creare un intervallo denominato ho usato il seguente:

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

e poi a specificare che intervallo denominato come l'origine dei dati durante la creazione della nuova tabella pivot ho semplicemente passare il valore di stringa del nome di intervallo nel metodo 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 
        ); 

Ora, quando le righe vengono aggiunti o eliminati all'interno della DataSourceWorkSheet la tabella pivot verrà riferimento a solo le celle con valori di dati utilizzando l'intervallo denominato. L'aggiornamento della tabella pivot ora funziona come previsto, chiamando RefreshTable:

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

pivot.RefreshTable(); 

Nel complesso, questo sarebbe successo all'interno di un metodo per creare una nuova cartella di lavoro Excel o aggiornare una cartella di lavoro esistente. Chiamare questo metodo per una cartella di lavoro esistente ora si basa sul fatto che la tabella pivot esistente è stata creata utilizzando un intervallo denominato dinamico e verrà aggiornata di conseguenza.

+0

Se qualche altro utente di SO trova questo utile o vorrebbe vedere un esempio funzionante, fammi sapere. –

5

è molto semplice ..

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

Questo è tutto ..

Ricordate, sempre abbiamo bisogno di dare Row e il formato di colonna.

E.g.

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

cioè "SheetName!R1C1:R12C13" così.

Se si dà "SheetName!$A$1:$Q$18" in questo modo, non funzionerà.

Problemi correlati