2017-09-01 7 views
1

Ich versuche, Daten von meiner C# -Code zu MS Excel 2007 zu exportieren, aber es nimmt 30 Sekunden Daten in einem Excel-file.The Code einzufügen sind wie this->Exportieren von Daten nach Excel sehr langsam

Excel.Application excelapp = new Excel.Application(); 

Excel.Workbook excelworkbook = excelapp.Workbooks.Open(fileTest); 

Excel.Sheets excelsheets = excelworkbook.Worksheets; 

Excel.Worksheet mysheets = (Excel.Worksheet)excelsheets.get_Item("Sheet1"); 

Excel.Range mycells = mysheets.Cells; 

mycells.Item[destroyer, "A"].Value = s[2]; 

mycells.Item[destroyer, "B"].Value = s[1]; 

mycells.Item[destroyer, "C"].Value = s[3]; 

mycells.Item[destroyer, "D"].Value = dbl_standard.Text; 

mycells.Item[destroyer, "E"].Value = s[4]; 

mycells.Item[destroyer, "F"].Value = s[7]; 

mycells.Item[destroyer, "G"].Value = s[5]; 

mycells.Item[destroyer, "H"].Value = s[6]; 

excelworkbook.Save(); 

excelworkbook.Close(); 

excelapp.Quit(); 

Marshal.ReleaseComObject(mycells); 

Marshal.ReleaseComObject(mysheets); 

Marshal.ReleaseComObject(excelsheets); 

Marshal.ReleaseComObject(excelworkbook); 

Marshal.ReleaseComObject(excelapp); 

Ich füge kaum 25 Spalten ein.Welches mache ich falsch? Wie mache ich es schnell?

Vielen Dank im Voraus

+2

Mögliche Duplikate von [Microsoft.Office.Interop.Excel wirklich langsam] (https://stackoverflow.com/questions/3989122/microsoft-office-interop-excel-really-slow) – grek40

+0

@ grek40 dieses ist eine Art von duplizieren-ish. Shughams Problem ist anders wegen der Anzahl der Operationen, die er auf der Excel-Tabelle ausführt. Die meiste Zeit wird damit verbracht, Excel.exe zu öffnen, im obigen Beispiel wird es meistens von der Anzahl der geänderten Werte übernommen. – CodeMonkey

+1

@CodeMonkey fair genug, Sie haben wahrscheinlich recht, angesichts der geringen Datenmenge. – grek40

Antwort

2

Sie haben hier zwei Probleme. Das erste Problem ist, dass Excel-Interop tatsächlich Excel.exe öffnet und Iteroprates mit dem Prozess. Sie werden nicht in der Lage sein, den Overhead des Startens von Excel zu entfernen, was wahrscheinlich der Hauptteil Ihrer Verarbeitungszeit ist.

Der andere Teil ist, dass Sie für jede Zelle, die Sie bearbeiten, viele Anrufe "unter der Haube" für die Interop-Ebene erstellen. Sie können diese Aufrufe vektorisieren.

Zum Lesen: https://stackoverflow.com/a/42604291/3387223

Zum Schreiben (VB Beispiel): https://stackoverflow.com/a/23503305/3387223

diese Weise können Sie nur für den gesamten Wertebereich ein Interop Betrieb erstellen. Dies ist ungefähr 25 mal schneller als das Einfügen von 25 Werten.

Aber wie ich oben erwähnt habe, ist das Starten von Excel wahrscheinlich das, was die meiste Zeit kostet.

Sie können Excel-Tabellen schneller mit OpenXML lesen und schreiben, aber vielleicht stoßen Sie auf einige Formatierungsprobleme, und Sie erhalten keine sofortigen Aktualisierungen anderer Formeln in Ihrer Excel-Tabelle (wenn Sie das brauchen).

https://msdn.microsoft.com/en-us/us-en/library/office/bb448854.aspx

Hier ist ein Beispiel auf die Generierung von Excel-Sheets:

https://msdn.microsoft.com/en-us/library/office/hh180830(v=office.14).aspx

Und wenn Sie eine einfachere Zeit mit OpenXml tun wollen, ist es ClosedXml:

https://github.com/closedxml/closedxml

Welche macht OpenXml so einfach wie Standard Inter op.

+0

Können Sie mir Beispielcode geben? – Shubham

+0

Lesen Sie meine Antwort und wählen Sie Ihre Art, es zu tun? Ich würde vorschlagen, mit 'ClosedXml' zu gehen. – CodeMonkey

+0

Ich weiß nicht über ClosedXml und OpenXml.Können Sie mir nur eine Lösung für diesen Code geben – Shubham

Verwandte Themen