2009-12-10 3 views
7

Wird bei der Löschung einer ersten Zeile in einer mehr als 20.000 Zeilen umfassenden Excel-Datei mit OpenXML SDK v2.0 ein Leistungsproblem festgestellt?Open XML SDK v2.0 Leistungsproblem beim Löschen einer ersten Zeile in mehr als 20.000 Zeilen Excel-Datei

Ich verwende die Löschzeilencodierung, die im Open XML SDK-Dokument vorgeschlagen wird. Es dauert einige Minuten, nur um die erste Zeile mit Open XML SDK zu löschen, aber es dauert nur eine Sekunde in Excel-Anwendung.

Ich fand schließlich heraus, dass der Engpass tatsächlich auf dem Bubble-Up-Ansatz im Umgang mit Zeilenlöschung ist. Nach der gelöschten Zeile werden viele Zeilen aktualisiert. In meinem Fall sind also etwa 20.000 Zeilen zu aktualisieren, wobei die Daten Zeile für Zeile verschoben werden.

Ich frage mich, ob es gibt einen schnelleren Weg, um die Löschung der Zeile zu tun.

Hat jemand eine Idee?

Antwort

4

Nun, die schlechte Nachricht hier ist: yep, das ist die Art, wie es ist.

Sie können etwas bessere Leistung außerhalb des SDK selbst in System.IO.Packaging und nur die Schaffung eines IEnumerable/List in wie Linq-to-XML aller Zeilen, Kopie, die auf einen neuen IEnumerable/List ohne die erste Reihe sich zu bewegen, schreibe das r Attribut von wieder in den Index, und schreibe das zurück in <sheetData/> über existierende Kinder.

Sie benötigen würden tun, um Art dasselbe für alle Strings in der 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 nun implizit indiziert, also könntest du einfach damit davonkommen, sie zu entfernen.

0

Der Ansatz, die Datei zu entpacken, zu manipulieren und neu zu packen ist sehr fehlerbehaftet.

Wie wäre es damit: Wenn Sie sagen, dass es in Excel funktioniert: Haben Sie versucht, das Interop zu verwenden? Dies startet 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 zum Löschen von Elementen. Sehen Sie sich an: MSDN Range-Description. Ein weiterer Hinweis: Interop verwendet Excel, also müssen alle Objekte mit einem 1-basierten Index adressiert werden! Weitere Ressourcen finden Sie unter this StackOverflow-thread.

Verwandte Themen