C# Listen in Excel übertragen mit Performance-Probleme

OP #7316239

Hallo,

Ich habe ein Programm geschrieben welches Werte aus einer XML Datei liest und diese in eine Excel übertragen soll. Die Funktionalität ist gegeben. Das auslesen der XML geht super schnell, allerdings dauert das schreiben in die Excel verhältnismäßig lange.

Ich schreibe die Werte beim einlesen der XML Datei direkt in eine mehrdimensionale Liste und per Button wird die Excel über eine foreach Schleife gefüllt:

1
foreach (var list in datenWire)
2
{                    
3
  list.ForEach(x => { xlWorkSheet.Cells[rw, cl] = x; cl += 1; });
4
  ...
5
  rw += 1;
6
  cl = 2;
7
}

Jetzt zur Frage: Gibt es eine Funktion womit ich die Liste Spaltenweise oder auch komplett in die Excel übertragen kann ohne jede Zelle einzeln per Schleife zu füllen?

Vielleicht habt ihr ja auch noch weitere Verbesserungsvorschläge, womit das Programm strukturierter und/oder schneller wird.

Angehängte Dateien:
Gast #7316276

Es gibt tatsächlich eine Möglichkeit, die Liste in ein Excel-Arbeitsblatt zu schreiben, ohne jede Zelle einzeln zu bearbeiten. Eine Möglichkeit wäre, die Liste in einen Datentabelle zu konvertieren und dann die Methode "WriteXml" zu verwenden, um den Inhalt der Tabelle in eine Excel-Datei zu schreiben.

Ein Beispiel für den Code wäre:

1
// Konvertieren Sie die Liste in eine DataTable
2
DataTable dt = new DataTable();
3
dt = ConvertToDataTable(datenWire);
4

5
// Legen Sie den Pfad und Dateinamen für die Excel-Datei fest
6
string path = @"C:\temp\ExcelFile.xlsx";
7

8
// Schreiben Sie die DataTable in die Excel-Datei
9
dt.WriteXml(path);

Alternativ kannst Du auch die OpenXML Bibliothek oder die Interop Bibliothek verwenden, um die Daten in die Excel-Datei zu schreiben. Diese Bibliotheken bieten spezielle Methoden zum Einfügen von Daten in Excel-Tabellen.

Ein weiterer Vorschlag, um das Programm schneller zu machen, wäre es, den Zugriff auf die Excel-Datei zu optimieren, indem man die Excel-Datei nur einmal öffnet und schließt, anstatt sie jedes Mal zu öffnen und zu schließen, wenn die Daten eingefügt werden sollen.

Grüße!

OP #7316318

Super Danke, werde ich mich gleich mal zu belesen.

Zu deiner Verbesserung: Da geb ich dir vollkommen Recht. Den Part mit der Excel auszulagern und beim beenden des Programms erst zu schließen wäre eine Option und würde das Programm schlanker machen.

Beste Grüße

#7316347

Wenn das über DCOM läuft (eine Instanz von Excel ist offen und du siehst das Tabellenblatt), kannst du auch die Bildschirmaktualisierung und/oder Neuberechnung temporär ausschalten.

Nach dem füllen aber wieder aktivieren.

OP #7376379

Hallo,

ich hab ein Update zu meinem vorherigen Problem. Ich habe jetzt die .xlsx Datei durch ein .csv Dateiformat ersetzt und nutze die string.join() Methode um die mehrdimensionale Liste Zeilenweise auszugeben:

1
foreach (var list in datenWire)
2
{
3
  sw.WriteLine(string.Join(";", list));
4
}

Viele Grüße

#7378324

Also zum beschleunigen gibts einige Schrauben: Application.Screenupdate ; Application.EnableEvents ; Application.EnableCalculation

dann reine Werte mit Range.Value2 = <neuer Wert> zuweisen.

Du kannst aber auch ein 2-dimensionales Array einem Range zuweisen, dann muss aber das Format passen (Array beginnt mit Index 1; Range muss der Größe des Arrays entsprechen).

Range.value2 = <Array>

notfalls aus dem Range erst ein Array erstellen

1
Dim rangedata as Variant
2
rangedata=Range.Value2
3
//dann deine Daten in rangedata übertragen
4
//und wieder zurückschreiben
5
Range.Value2=rangedata

geht alles wesentlich schneller als einzelne Zellen zu beschreiben.

Sascha

#7378364

Robin F. schrieb:

Ich habe ein Programm geschrieben welches Werte aus einer XML Datei liest und diese in eine Excel übertragen soll.

Wenn "In eine Excel" bedeutet, dass tatsächlich in eine laufende Programminstanz exportiert werden soll, wird das immer langsam bleiben.

Wenn es der Export in eine Datei im XLSX-Format (aka "Excel-Datei") sein soll, gibt es einige Möglichkeiten, das sehr performant durchzuführen. Wenn es keine kommerzielle Library sein soll, suchst Du am besten nach SAX und Open XML SDK.

Beispiele und Hinweise gibt es viele, z.B. https://www.c-sharpcorner.com/article/creating-excel-file-using-openxml/

#7381242

Du solltest nicht jeden Wert einzeln in die Excelliste schreiben. Ein Zugriff dauert relativ lange. Eine einfache Möglichkeit die Zugriffe zu reduzieren ist, die Werte zu sammeln und zuvor in einem zweidimensionalen Array zu speichern. Dann das zweidimensionale Array der entsprechenden Range im Excel zuweisen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 3 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.