Forum: PC-Programmierung C# Listen in Excel übertragen mit Performance-Probleme


von Robin F. (gehacktes)


Angehängte Dateien:

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.

: Bearbeitet durch User
von KI (Gast)


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!

von Robin F. (gehacktes)


Lesenswert?

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

von Dirk B. (dirkb2)


Lesenswert?

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.

von Robin F. (gehacktes)


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

von Sascha W. (sascha-w)


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

: Bearbeitet durch User
von Klaus P. (kpi6288)


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/

von Chris (synchmaster)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.