Rendimiento tema abierto v2.0 SDK de XML cuando se elimina una primera fila de más de 20.000 filas del archivo de Excel

StackOverflow https://stackoverflow.com/questions/1878207

Pregunta

No cualquiera que venga a través de un problema de rendimiento cuando se elimina una primera fila en un archivo de Excel de 20.000 filas utilizando v2.0 OpenXML SDK?

Estoy utilizando la fila de eliminación codificación se sugiere en el documento SDK de XML abierto. Me lleva varios minutos para eliminar la primera fila utilizando el SDK de XML abierto, pero sólo se necesita sólo un segundo en applicaton Excel.

Finalmente me di cuenta que el cuello de botella está en realidad en el enfoque de la burbuja en marcha para hacer frente a la fila eliminación. Hay muchas filas de actualización después de la fila eliminada. Así que en mi caso, hay alrededor de 20.000 filas para ser actualizados, cambiando hasta la fila de datos por fila.

Me pregunto si hay alguna manera más rápida de hacer la eliminación de filas.

Hacer Alguien tiene una idea?

¿Fue útil?

Solución

Bueno, la mala noticia es: Sí, esa es la forma en que está

.

Usted puede obtener un mejor rendimiento fuera del propio SDK entrando en System.IO.Packaging y simplemente creando un IEnumerable / List en como LINQ to XML de todas las filas, copiar eso a una nueva IEnumerable / List sin la primera fila, reescritura el atributo de r <row r="?"/> sea su lugar en el índice, y la escritura que de nuevo <sheetData/> interior sobre los niños existentes.

Usted necesitaría tipo de hacer lo mismo para cualquier cadena en el archivo sharedStrings.xml - es decir, la eliminación de los elementos <ssi>.<si> que estaban en la fila que se ha eliminado, pero en este caso se ahora implícitamente indexados, por lo que sería capaz de salirse con sólo la eliminación pura y simple de ellos.

Otros consejos

El enfoque de descomprimir el archivo, manipulándolo y volver a empaquetar es muy errores de ciruela.

¿Qué tal esto: Si usted dice, que funciona bien en Excel: ¿Ha intentado utilizar la interoperabilidad? Así se inicia una nueva instancia de Excel (visible o invisible), entonces se puede abrir el archivo, elimine la línea, guardar y cerrar de nuevo la aplicación.

using System;
using System.IO;
using Microsoft.Office.Interop.Excel;
using Excel = Microsoft.Office.Interop.Excel;
public void OpenAndCloseExcel() 
{
    Excel.Application excelApp = new Excel.Application();
    // Open Workbook, open Worksheet, delete line, Save
    excelApp.Quit();
}

La gama de objetos es cualificado para muchos propósitos. También para los elementos de borrado. Echar un vistazo a: de MSDN-Rango Descripción . Un consejo más: interoperabilidad utiliza Excel, por lo que todos los objetos tienen que ser adressed con un índice basado en 1! Para obtener más recursos echar un vistazo a este hilo StackOverflow-.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top