SDK Open XML v2.0 Problème de performance lors de la suppression d'une première ligne de lignes de fichiers 20.000+ Excel

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

Question

Est-ce que quelqu'un est venu sur un problème de performance lors de la suppression d'une première ligne dans un fichier Excel de lignes à l'aide 20.000+ v2.0 SDK OpenXML?

J'utilise la ligne de suppression code suggéré dans le document SDK Open XML. Il me prend plusieurs minutes juste pour supprimer la première ligne en utilisant SDK Open XML, mais il ne prend juste une seconde dans Excel applicaton.

J'ai finalement trouvé que le goulot d'étranglement est en fait sur l'approche de bulle dans le traitement avec la suppression de la ligne. Il y a beaucoup de lignes de mise à jour après la ligne supprimée. Donc, dans mon cas, il y a environ 20 000 lignes à jour, décalage la ligne de données par ligne.

Je me demande s'il y a une façon de faire la suppression de la ligne plus rapide.

Avez-ce que quelqu'un a une idée?

Était-ce utile?

La solution

Eh bien, les mauvaises nouvelles ici est la suivante: yep, c'est la façon dont il est

.

Vous pouvez obtenir des performances légèrement meilleures déplacer en dehors du SDK lui-même dans System.IO.Packaging et créer juste un IEnumerable / List dans comme LINQ à XML de toutes les lignes, copier ce fichier dans une nouvelle IEnumerable / List sans la première rangée, rewrite l'attribut r de <row r="?"/> pour que ce soit sa place dans l'index et l'écriture qui à l'intérieur <sheetData/> sur les enfants existants.

Vous auriez besoin de genre de faire la même chose pour toutes les chaînes de caractères dans le sharedStrings.xml fichier - à savoir la suppression des éléments de <ssi>.<si> qui se trouvaient dans la ligne qui a été supprimée, mais dans ce cas ils sont maintenant implicitement indexé, de sorte que vous seriez en mesure de sortir avec juste carrément les supprimer.

Autres conseils

L'approche de décompressé le fichier, la manipulation et le remballage, il est très pruneau d'erreur.

Que diriez-vous ceci: Si vous dites que cela fonctionne très bien dans Excel: Avez-vous essayé d'utiliser l'Interop? Cela commence une nouvelle instance d'Excel (visible ou invisible), vous pouvez ouvrir le fichier, supprimez la ligne, enregistrez et fermez l'application.

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 gamme objet est qualifié à de nombreuses fins. En outre pour la suppression d'éléments. Jetez un oeil à: MSDN Range-description . Un autre indice: Interop utilise Excel, de sorte que tous les objets doivent être avec un indice adressé base 1! Pour plus de ressources jeter un oeil à cette -fil StackOverflow.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top