2011-11-21 79 views
7

Me gustaría saber cómo actualizar una fuente de datos de tabla dinámica existente. Estoy usando Microsoft.Office.Interop.Excel y estoy apuntando a usuarios con Excel 2010.Cómo actualizar la fuente de datos de tabla dinámica usando C#?

Actualmente puedo actualizar la tabla dinámica que funciona bien, sin embargo, cuando se agregan más filas, quiero incluir estas filas en el origen de datos de la tabla dinámica. Por ejemplo, el origen de datos de la tabla dinámica cuando se ve en Excel es DataSourceWorksheet!$A$2:$U$26 y me gustaría que se cambie a DataSourceWorksheet!$A$2:$U$86 (60 filas más) después de que se haya ejecutado mi código de archivo de actualización/actualización de Excel.

Aquí es una versión simplificada de mi código

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 solución que puede funcionar, sería simplemente regenerar la tabla dinámica utilizando de nuevo wrkBook.PivotTableWizard(...). Sin embargo, esto no funcionará para mi situación, ya que los usuarios preferirían modificar su tabla dinámica al cambiar los campos seleccionados, filas, columnas, etc. Solo necesita actualizarse cuando cambie la hoja de trabajo del origen de datos.

+1

No estoy seguro de por qué esto fue rechazado, parece una pregunta razonable para mí. – neontapir

+0

Sí, tampoco estoy seguro, este no es el tipo de cosas que he encontrado fácilmente en MSDN o en recursos similares. –

Respuesta

2

La solución a este problema fue utilizar un Dynamic Named Range en Excel para el origen de datos de la tabla dinámica. La fórmula de rango dinámico llamado utiliza una combinación de la OFFSET function y la COUNTA function así:

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

La fórmula anterior se traducirá en un rango de celdas dentro de A2: A1000 que tienen datos. En mi caso, requirió más de una columna y un mayor rango de filas para 'verificar' los datos.

Ahora en C# para crear un rango con nombre que utilizó la siguiente:

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

y luego especificar que rango con nombre como la fuente de datos al crear la nueva tabla dinámica que simplemente pasar el valor de cadena de la nombre de rango en el método 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 
        ); 

Ahora, cuando se añaden o se eliminan filas dentro de la DataSourceWorkSheet la tabla dinámica sólo se hace referencia a la células con valores de datos mediante el uso del rango con nombre. La actualización de la tabla dinámica ahora sólo funciona como se esperaba, llamando RefreshTable:

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

pivot.RefreshTable(); 

En general, esto estaría sucediendo dentro de un método para crear un nuevo libro de Excel o actualizar una libro existente. Llamar a este método para un libro de trabajo existente ahora se basa en el hecho de que la tabla dinámica existente se creó utilizando un rango dinámico nombrado y se actualizará en consecuencia.

+0

Si a otros usuarios de SO les parece útil o les gustaría ver un ejemplo que funcione, avíseme. –

5

su muy simple ..

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

Eso es todo ..

Recuerde, siempre tenemos que dar Row y formato de columna.

E.g.

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

es decir "SheetName!R1C1:R12C13" así.

Si le das "SheetName!$A$1:$Q$18" de esta manera, no funcionará.

Cuestiones relacionadas