C# Listen in Excel übertragen mit Performance-Probleme

OP #7316239
Lesenswert?

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
Lesenswert?

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 #7376379
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren