Seite 1 von 1

Excel über COM richtig speichern und schließen

Verfasst: Mittwoch 20. Oktober 2021, 15:13
von tobi45f
Hallo zusammen,

ich möchte eine Excel-Vorlage per Python befüllen. Da ich auch Spalten löschen und vorhandene Checkboxen setzen muss und openpyxl (soweit ich das richtig sehe) diese Funktionen nicht zur Verfügung stellt, müsste ich es über die COM Schnittstelle umsetzen.

Ich bekomme die Exceldatei über die Schnittstelle geöffnet, die Spalten werden gelöscht bzw. die Checkboxen kann ich ansteuern. Blöderweise bleibt Excel immer hängen, sodass ich es im Taskmanager schließen muss. Wie schließe ich die Datei richtig? Es kann doch nicht so schwer sein :D aber ich finde leider nichts, was mir hilft...

Und: Kann es sein, dass man die Datei bei der Ansteuerung über die COM Schnittstelle nicht speichern muss? Zumindest sind die Inhalte übernommen (nachdem ich im Taskmanager die Datei geschlossen habe und dann neu geöffnet habe), also es wurden die Spalten gelöscht.
Folgender Fehler kommt bei Excel.Save() (auch mit Eingabe eines Pfades):
Exception has occurred: com_error
(-2147352567, 'Ausnahmefehler aufgetreten.', (0, 'Microsoft Excel', 'Die Save-Methode des Application-Objektes konnte nicht ausgeführt werden.', 'xlmain11.chm', 0, -2146827284), None)

Code: Alles auswählen

import win32com.client
excel = win32com.client.gencache.EnsureDispatch("Excel.Application")
excel.Workbooks.Open(Filename=r'C:\Users\..\Desktop\TestOutput\test.xlsx')
excel.Visible = 0
excel.Worksheets("Tabelle1").Range("A:B").Select()
excel.Selection.Delete()
#excel.Save()
excel.Application.Quit()
del excel
Kann mir jemand einen Anstoß geben, was hier faul ist?

Re: Excel über COM richtig speichern und schließen

Verfasst: Mittwoch 20. Oktober 2021, 16:05
von __blackjack__
@tobi45f: Randbemerkung: Die letzte Zeile mach keinen Sinn. So ein ``del`` eines Namens deutet in 99,9% der Fälle darauf hin, das der Autor diese Anweisung nicht bzw. falsch verstanden hat. ``del`` mit einem Namen löscht den *Namen*, und *nicht* das Objekt. ``del`` mit Namen ist ein Mittel um den Namensraum sauber zu halten. Es ist kein Mittel zur Speicherverwaltung oder zur *deterministischen* Zerstörung von Objekten, wie das beispielsweise ``delete`` in C++ wäre.

Re: Excel über COM richtig speichern und schließen

Verfasst: Donnerstag 21. Oktober 2021, 06:26
von tobi45f
viewtopic.php?t=170
hm..

https://stackoverflow.com/questions/215 ... n/21514970
hier heißt es, dass das Objekt gelöscht wird, wenn die letzte Referenz gelöscht wird..? Da dies mein einziger Verweis (oder etwa nicht?) ist hätte ich gedacht, dass dann "excel" auch gelöscht wird.
Aber what ever, das del ist auch optional, eigentlich sollte "excel" vorher schon weg sein, da die Application eigentlich geschlossen sein sollte - was sie aber nicht ist.

Re: Excel über COM richtig speichern und schließen

Verfasst: Donnerstag 21. Oktober 2021, 11:13
von __blackjack__
@tobi45f: In der Dokumentation steht, dass ein Objekt vielleicht, irgendwann gelöscht wird, wenn es nicht mehr vom Programm aus erreichbar ist. Und auf mehr darf man sich nicht verlassen. CPython ist auch nicht die einzige Implementierung und die Art wie das die automatische Speicherverwaltung organisiert, kann sich auch in künftigen Versionen ändern.

`excel` ist *Dein* einziger Verweis auf das Objekt. Das heisst nicht, das es keine anderen mehr geben kann. Und an der Stelle ist das Programm doch sowieso am Ende angelangt, da macht das wenig Sinn den Namen zu löschen, denn beim ”herunterfahren” des Programms löscht Python selbst die Inhalte von den Modulen und dann die Module selbst.