Solución:
Bueno, hay una solución bastante buena para esto. Con OpenXML puede activar la opción “actualizar datos al abrir el archivo” en la tabla dinámica (haga clic con el botón derecho en la tabla dinámica-> Opciones de tabla dinámica-> pestaña Datos). Esto da como resultado la actualización automática de la tabla dinámica cuando el usuario abre la hoja de cálculo por primera vez. El código:
using (var document = SpreadsheetDocument.Open(newFilePath, true))
{
var uriPartDictionary = BuildUriPartDictionary(document);
PivotTableCacheDefinitionPart pivotTableCacheDefinitionPart1 = (PivotTableCacheDefinitionPart)uriPartDictionary["/xl/pivotCache/pivotCacheDefinition1.xml"];
PivotCacheDefinition pivotCacheDefinition1 = pivotTableCacheDefinitionPart1.PivotCacheDefinition;
pivotCacheDefinition1.RefreshOnLoad = true;
}
necesita determinar la “ruta” a la suya pivotCacheDefinition: utilice la herramienta de productividad OpenXML SDK 2.0 para buscarla.
BuildUriPartDictionary es un método estándar generado por OpenXML SDK 2.0 Productivity Tool
protected Dictionary<String, OpenXmlPart> BuildUriPartDictionary(SpreadsheetDocument document)
{
var uriPartDictionary = new Dictionary<String, OpenXmlPart>();
var queue = new Queue<OpenXmlPartContainer>();
queue.Enqueue(document);
while (queue.Count > 0)
{
foreach (var part in queue.Dequeue().Parts.Where(part => !uriPartDictionary.Keys.Contains(part.OpenXmlPart.Uri.ToString())))
{
uriPartDictionary.Add(part.OpenXmlPart.Uri.ToString(), part.OpenXmlPart);
queue.Enqueue(part.OpenXmlPart);
}
}
return uriPartDictionary;
}
Otra solución es convertir su hoja de cálculo a macro habilitada, incrustar allí un script VBA que actualizará todas las tablas dinámicas. Esto puede suceder al hacer clic en el botón o nuevamente cuando el usuario abre la hoja de cálculo. Aquí puede encontrar el código VBA para actualizar las tablas dinámicas: http://www.ozgrid.com/VBA/pivot-table-refresh.htm
Creo que la única forma de hacerlo es siguiendo este tipo de método.
- Guarde el libro de trabajo XML abierto en un archivo xlsx.
- Cargue el libro con el modelo de objetos de Excel.
- Llamar a cualquiera
ThisWorkbook.PivotCaches(yourIndex).Refresh();
o
ThisWorkbook.RefreshAll();
aunque estaba bastante seguro de que RefreshAll también funcionaría.
- Utilice el modelo de objetos para guardar el libro de trabajo y cerrarlo.
- Vuelva a abrir para usar con espacios de nombres xml.
No puede hacer esto con Open XML. Open XML le permite trabajar con los datos almacenados en el archivo y cambiar los datos y fórmulas y definiciones y demás. En realidad, no hace ningún cálculo.
La automatización de Excel funcionaría técnicamente, pero no se recomienda en absoluto para un entorno de servidor y es mejor evitarla en el escritorio si es posible.