Pregunta

Tengo un archivo de Excel 2007 (formato OpenXML) con una conexión a un archivo XML. Esta conexión genera una tabla dinámica de Excel y gráficos.

Estoy tratando de encontrar una manera de OpenXML SDK v2 a hacer lo mismo que el botón "Actualizar todo" en Excel. De modo que pudiera actualizar automáticamente mi archivo tan pronto como se proporciona un nuevo archivo XML.

Gracias.

¿Fue útil?

Solución

No se puede hacer esto con Open XML. Open XML que permite trabajar con los datos almacenados en el archivo y cambiar los datos y las fórmulas y definiciones y tal. En realidad, no hacer ningún cálculo.

automatización de Excel técnicamente podría funcionar, pero definitivamente no está recomendado para un entorno de servidor y es mejor evitarlos en el escritorio, si es posible.

Otros consejos

El pozo allí es bastante buena solución para esto. El uso de OpenXML se puede convertir en "datos de actualización al abrir el archivo" opción en la tabla dinámica (botón derecho del ratón sobre el pivote table-> tabla dinámica Opciones-> pestaña Datos). Este resultado en la tabla dinámica actualización automática cuando el usuario abre por primera hoja de cálculo. 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;               
        }

es necesario determinar "camino" a la suya pivotCacheDefinition - OpenXML uso del SDK 2.0 Herramienta de productividad que buscarlo

.

BuildUriPartDictionary es un método estándar generada por OpenXML SDK herramienta de productividad 2.0

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 la hoja de cálculo a macroenabled, no incrustar una secuencia de comandos de VBA que refrescará todas las tablas dinámicas. Esto puede suceder en el clic de botón o de nuevo cuando el usuario abre una hoja de cálculo. Aquí puede encontrar el código VBA para tablas dinámicas de actualización: http://www.ozgrid.com/VBA/pivot-table-refresh.htm

Creo que la única manera de hacer esto es después de este tipo de método ..

  1. Guardar XML abiertos libro de trabajo de nuevo a un archivo xlsx.
  2. Cargar el libro mediante el modelo de objetos de Excel.
  3. Llamada en cualquiera

ThisWorkbook.PivotCaches(yourIndex).Refresh();

o

ThisWorkbook.RefreshAll();

A pesar de que yo estaba bastante seguro RefreshAll también funcionaría.

  1. Usar el modelo de objetos para guardar el libro y cerca de ella.
  2. Volver a abrir para su uso con espacios de nombres XML.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top