C# Interop.Excel: Kann es passieren, dass eine Exceldatei vom vielen Üben langsamer wird?

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Bartosz.

    C# Interop.Excel: Kann es passieren, dass eine Exceldatei vom vielen Üben langsamer wird?

    Hallo zusammen,

    ich habe eine C# WinForms-Anwendung geschrieben. Ich nutze das Paket
    Microsoft.Office.Interop.Excel. Mit der Anwendung tue ich Folgendes:
    1. Ich öffne die bestehende Excelmappe.
    2. Ich schreibe einen Wert ans Ende der Tabelle. Ich finde dafür die letzte Zeile.
    3. Dann lese ich alle Werte aus, um mathematisch etwas zu berechnen.
    4. Dann mache ich solche Dinge, die die Tabelle wieder "hübsch machen", also Schriftgröße der neu geschriebenen Zeile setzen; AutoFit; die Zellrahmen aktualisieren (d.h. schwarze dünne Ränder um die inneren Zellen, dicken blauen Rand außenrum).
    5. Wenn es bereits ein Diagramm gibt, wird es mittels SetSourceData aktualisiert. Wenn es keines gibt, wird ein neues Diagramm gezeichnet. Bei letzterer Möglichkeit mache ich so ziemlich alles, was man machen kann: Punktdiagramm ohne Linien zwischen den Punkten; Titel setzen; Rahmen außenrum; Achsenbeschriftungen Schriftart und -größe; Achsentitel; für die y-Achse den Beginn ab 0; schwarze Achsenlinien zeichnen; Kreuz-Teilstriche. Die Punkte der Datenreihe färben und Größe auf 4 (etwas kleiner als Standard).
    6. Datei schließen. Da es die Datei bereits gibt, fragt Excel, ob man sie überschreiben möchte. Wenn der Dialog kommt, ist noch nicht alles auf dem Bildschirm aktualisiert. Später allerdings schon.
    7. Datei releasen.

    Ich habe in den letzten Tagen bereits gelesen, dass sämtliche Signale zwischen meiner WinForms-Anwendung und der Excelmappe langsam verkehren. So war ich der Auffasung, dass es "normal" sei, dass es lange dauert, die Tabellenrahmen zu zeichnen. Heute Morgen habe ich die Originaldatei kopiert. In der Kopie habe ich das Diagramm gelöscht, um etwas zu testen. Sämtliche Arbeiten an der Datei verliefen doppelt so schnell. Vor allem das Zeichnen der Tabellenrahmen, obwohl die Tabelle genauso groß ist wie in der Originaldatei.
    Daher meine Frage an euch und meine Vermutung: Kann es sein, dass meine originale Excel-Datei (unsichtbar) "kaputt" ist? Es gab während meiner Programmentwicklung öfter mal Debugging-Abbrüche, sodass die Excel-Datei "unvernünftig" geschlossen wurde, und Excel dann gefragt hat, ob man sie wiederherstellen will.

    Das Phänomen des schelleren Arbeitens tritt nur dann auf. Es tritt nicht auf, wenn ich die GUI offen behalte und zwischen Dateien wechsele. Also ich vermute keinen Fehler in meinem Programm.

    Viele Grüße
    Bartosz
    Wenn ich mir Diene Beschreibung so anschaue, arbeitest Du viel zu umständlich:
    • Lege Deine Werte in eine "intelligente" Tabelle (Start - Formatvorlagen - Als Tabelle formatieren).
    • Formatiere diese so wie Du willst.
    • Nimm die Tabelle als Basis für Dein Diagramm
    • Wenn jetzt ein neuer Wert an das Ende der Tabelle gesetzt wird, sollte eigentlich die Formatierung und die Berechnung der vorhergehenden Zellen übernommen werden und das Diagramm aktualisiert werden.

    Das Zeichnen in Excel auf die Oberfläche ist immer langsam.
    Normalerweise unterbindet man bei Excel das Aktualieren der Oberfläche mit Application.ScreenUpdating = False. Wenn man fertig ist, wird es natürlich wider eingeschaltet.

    Ja Excel schreibt jede Menge-Formatierungs-Daten in die Datei. In einer älteren Excel-Version habe ich da mal den Fehler bekommen: "Es kann nicht mehr Formatiert werden, da zu viele Formatierungen vorhanden sind. Lsöchen Sie ein Zellformat"). Es war eine Excel 2003-Datei und es waren über 5000 unterschiedliche Zellformate in der Datei vorhanden.

    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    Excel wird auch langsam, wenn ein Worksheet sehr viele unbenutzte leere Zeilen und Spalten enthält.
    Zeig dir mal den Worksheet.UsedRange an.
    Wenn der offensichtlich zu groß ist, dann lösche überflüssige Zeilen und Spalten.
    Du siehst das auch an der Dateigröße.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --