Frage

Sie über ein Performance-Problem jemand kommen, wenn eine erste Zeile in einer 20.000+ Zeilen Excel-Datei mit OpenXML SDK v2.0 zu löschen?

Ich bin mit der Zeile löscht Codierung im Open XML SDK Dokument vorgeschlagen. Es dauert einige Minuten nur die erste Zeile mit Open XML SDK zu löschen, aber es dauert nur nur eine Sekunde in Excel applicaton.

Ich fand schließlich heraus, dass der Flaschenhals tatsächlich auf dem Bubble-up-Ansatz ist mit Reihen Löschung im Umgang. Es gibt viele Zeilen nach der gelöschten Zeile zu aktualisieren. Also in meinem Fall gibt es rund 20.000 Zeilen aktualisiert werden, die Daten Zeile für Zeile Schalten.

Ich frage mich, ob es ein schnellerer Weg, ist die Zeile Löschen zu tun.

Hat jemand eine Idee?

War es hilfreich?

Lösung

Nun, die schlechte Nachricht ist hier: Yep, das ist so, wie es ist

.

Sie können etwas bessere Leistung außerhalb des SDK selbst in System.IO.Packaging bewegen und nur eine IEnumerable Schaffung / List in wie Linq-to-XML aller Zeilen, Kopie, die auf einen neuen IEnumerable / List ohne die erste Reihe, Rewrite das r Attribut <row r="?"/> im Index seinen Platz zu sein, und die Schreib, die innerhalb <sheetData/> über bestehende Kinder zurück.

Sie müssen zu Art das gleiche zu tun für alle Strings in dem sharedStrings.xml Datei - dh die <ssi>.<si> Elemente zu entfernen, die in der Reihe waren, die gelöscht wurden, aber in diesem Fall sind sie jetzt implizit indiziert, so dass Sie der Lage wäre, mit nur geradezu Entfernen von ihnen wegzukommen.

Andere Tipps

Der Ansatz, um die Datei von dem Entpacken, es zu manipulieren und Umpacken ist es sehr fehler Pflaume.

Wie wäre es damit: Wenn Sie sagen, dass es in Excel funktioniert gut: Haben Sie versucht, die Interop zu benutzen? Dies beginnt eine neue Instanz von Excel (entweder sichtbar oder unsichtbar), dann können Sie die Datei öffnen, löschen Sie die Zeile, speichern und schließen Sie die Anwendung erneut.

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();
}

Das Range-Objekt ist für viele Zwecke geeignet. Auch für das Löschen von Elementen. Werfen Sie einen Blick auf: MSDN Bereich-Beschreibung . Ein weiterer Tipp: Interop verwendet Excel, so dass alle Objekte haben mit einem 1-basierten Index adressiert werden! Weitere Ressourcen zu sehen dieser Stackoverflow-Thread .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top