Excel über COM richtig speichern und schließen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
tobi45f
User
Beiträge: 24
Registriert: Montag 22. Februar 2021, 14:31

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?
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
tobi45f
User
Beiträge: 24
Registriert: Montag 22. Februar 2021, 14:31

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten