Laden...

Datenexport von DataGrid in Excel mittels Interop ist zu langsam

Erstellt von der_sharky vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.814 Views
D
der_sharky Themenstarter:in
23 Beiträge seit 2017
vor 5 Jahren
Datenexport von DataGrid in Excel mittels Interop ist zu langsam

Ich bin dabei eine WPF Anwendung zu schreiben, die Daten aus Datenbank nimmt und sie in DataGrid zeigt. Dann mittels einen Buttonklick wird eine Excel Datei erstellt und mit der Daten befüllt. Bei Großen Mengen wie 20000 Zeilen dauert die Befüllung in Excel zu lange. Hat jemanden eine Idee woran es liegt. Danke euch


private void copyAlltoClipboard()
    {
        Clipboard.Clear();
        DataGrid1.SelectAllCells();
        DataGrid1.ClipboardCopyMode = DataGridClipboardCopyMode.IncludeHeader;
        ApplicationCommands.Copy.Execute(null, DataGrid1);

    }


    private void Button_Click(object sender, RoutedEventArgs e)
    {
        copyAlltoClipboard();
        Excel.Application xlexcel;
        Excel.Workbook xlWorkBook;
        Excel.Worksheet xlWorkSheet;
        object misValue = System.Reflection.Missing.Value;
        xlexcel = new Excel.Application();
        xlexcel.Visible = true;
        xlWorkBook = xlexcel.Workbooks.Add(misValue);
        xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
        Excel.Range CR = (Excel.Range)xlWorkSheet.Cells[1, 1];
        CR.Select();
        xlWorkSheet.PasteSpecial(CR, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, true);
    }

1.029 Beiträge seit 2010
vor 5 Jahren

Hi,

naja - 20.000 Datensätze so zu "exportieren" ist ja auch kein Kleinkram. Wie lang dauert es denn wirklich?

Sofern du beim aktuellen Ansatz bleiben möchtest - würde ich ggf. noch


xlexcel.ScreenUpdating = false;
//... dein Code
xlexcel.ScreenUpdating = true;

versuchen.

Falls dir das nicht reicht müsstest du noch weiteres evaluieren:
a) Wie lange dauert eigentlich DataGrid.1.SelectAllCells() ? Falls es lange dauert - würde ich dort versuchen anders die Daten zu bekommen
b) Wie lange dauert CopyToClipBoard? Lange? Dann solltest du weitere Exportmethoden evaluieren
c) Wie lange das PasteSpecial? Lange? Dann solltest du weitere Exportmethoden evaluieren

Wenns denn nun eine andere Exportmethode sein muss:
a) Excel-Interop ist noch langsamer wie deine aktuelle Lösung
b) Interessant wäre ein Test mit ClosedXml (ist eine Lib für OpenXml - also das Format der neuen Excel-Dateien)
c) Falls die Daten in deinem Grid ohnehin nicht editierbar sind - was spricht gegen eine direkte Datenanbindung Excel<>Datenbank?

LG

D
der_sharky Themenstarter:in
23 Beiträge seit 2017
vor 5 Jahren

Hallo Taipi88,
danke für die ausführliche Antwort. Laut Debugger dauert copyAlltoClipboard() ca. 40 Sek. Das ist viel zu viel. Ich muss als erstes eine andere Möglichkeit finden die Daten zu kopieren. Würdest du mir etwas vorschlagen ? Danke dir sehr !!!

5.658 Beiträge seit 2006
vor 5 Jahren

Würdest du mir etwas vorschlagen ?

Lies doch bitte nochmal die Antwort von Taipi88.

Weeks of programming can save you hours of planning

1.029 Beiträge seit 2010
vor 5 Jahren

Hallo Taipi88,
danke für die ausführliche Antwort. Laut Debugger dauert copyAlltoClipboard() ca. 40 Sek. Das ist viel zu viel. Ich muss als erstes eine andere Möglichkeit finden die Daten zu kopieren. Würdest du mir etwas vorschlagen ? Danke dir sehr !!!

Naja - meine Fragen zu den Zeiten hast du nicht vollständig beantwortet.

a) Falls es so lange dauert die Zellen zu markieren - solltest du schauen, ob es ggf. schneller ist die Daten selbst in's Clipboard zu schreiben
b) Falls es ein anderer Teil der Methode ist würde ich wahrscheinlich nicht länger versuchen mit dem Clipboard zu arbeiten - sondern eben andere Exportmethoden zu evaluieren. (z.B. ClosedXml)

LG

PS:
Zu a) Du hast ja die Daten schon aus der DB und musst nicht den Umweg über die UI gehen.

D
der_sharky Themenstarter:in
23 Beiträge seit 2017
vor 5 Jahren

Hallo Taipi88,

ja sorry, dass ich alle deine Fragen nicht beantworten konnte bin ganz neu in C#. Begriffe wie OpenXML sagen mir nichts aber ich werde mich schlau machen.

Zu a) Leider muss die UI Bestandteil sein. Es ist auch für mich gut so da ich viel gelernt habe. Übrigens wenn du meinst dass man die Daten manuell in Clipboard einfügt, würde leider aus mehreren Gründe nicht gehen.

b) Ich werde mir ClosesXML näher anschauen.

Eigentlich das Problem liegt genau hier:

ApplicationCommands.Copy.Execute(null, DataGrid1); --- Hier dauert am meisten.

LG
Yves

1.029 Beiträge seit 2010
vor 5 Jahren

Hi,

ich sag ja nicht, dass dein DataGrid weg muss - aber du willst letztlich eine Tabelle im Clipboard haben nach aktueller Vorgehensweise. Das Ding ist - wenn dein restlicher Code etwas kann - dann hat nicht das DataGrid die Daten - sondern irgendein anderes Objekt, dass lediglich für's DataBinding verwendet wird. Ein Objekt, dass ggf. die Daten direkt in's Clipboard schreiben könnte, ohne dass das DataGrid die Daten aus dem Objekt abruft.

Ob dir das zeitlich was bringt kann ich leider nicht beurteilen (hab's noch nie gemacht), da das Ganze für mich recht unsauber wirkt. (Du hast z.B. keine Chance bei dieser Vorgehensweise eine nützliche ProgressBar zu präsentieren - und realistisch betrachtet: Das willst du aber, wenn die Anzahl der Datensätze mal irgendwann bei 2 Millionen und ähnlichen Scherzen gelandet ist - und so (und schlimmer) wird Excel leider in den meisten Unternehmen benutzt - egal für wie doof die Entwickler die Nutzer deshalb halten^^)

In anderen Worten: Mit ClosedXml kommst du sinnvoller und sicher auch von der Exportgeschwindigkeit schneller an's Ziel. (Auch wenn da sicherlich Einarbeitungsaufwand entsteht)

LG