Ich habe die excelRTDserver.py wird in Excel 2010 (32bit) ausgeführt, indem der Wert EXCEL_TLB_MINOR
in 7
geändert wird. Ich kann den Server in der Add-Ins-Liste sehen und wenn ich =RTD("Python.RTD.TimeServer","","seconds","5")
in eine Zelle eintrage, erhalte ich die aktuelle Zeit. Aber es wird nie aktualisiert. Wenn ich die "5" in eine andere Nummer ändere, erhalte ich ein Update, aber nach der ersten Änderung wird es nie wieder geändert.
Wie bekomme ich es zu aktualisieren? Ich habe jemand anderen mit einem ähnlichen Problem hier gefunden, aber keine Lösung.
UPDATE: Ich habe ein wenig weiter - es gibt eine Ausnahme in ServerStart, wenn das PyIDispatch-Callback-Objekt in ein IRTDUpdateEvent-Callback-Objekt umgewandelt wird. Mit dieser Methode zum Erfassen der Fehlermeldung erhalte ich "Kann keine Datei erstellen, wenn diese Datei bereits existiert.". Wenn ich dem Vorschlag hier folge und win32com.client.CastTo(CallbackObject,'IRTDUpdateEvent')
verwende, bekomme ich "This COM Objekt kann den Makepy-Prozess nicht automatisieren - bitte führen Sie makepy manuell für dieses Objekt aus, aber ich habe bereits makepy für Microsoft Excel 12.0 Object Library (1.6) ausgeführt.
Jede Hilfe würde sehr geschätzt werden.
Ich denke, Sie haben vielleicht kein Glück.
Laut dem Autor von "excelRTDServer.py" in einem kürzlichen python-win32-Thread :
Die Nachricht, dass dies eine Antwort darauf ist, beschreibt Ihr genaues Problem, und es ist neu, also haben Sie diese Information vielleicht schon direkt, aber für den Fall, dass Sie nicht ...
Ich befürchte, dass sich Dinge mit IRTDUpdateEvent mit den letzten Versionen geändert haben von Excel (seit Excel 2007? Ich denke, das ist nicht mehr so "neu" ...).
Bei der Suche nach Neuigkeiten über Schnittstellenänderungen bin ich auf dieses Problem gestoßen Thread in einem Java-Forum:
Der Teil, der mich beunruhigt, ist dieser Kommentar:
"Scheinbar in Excel 12 (Excel 2007) das RTD-Callback-Objekt, das Implementiert duale IRTDUpdateEvent-Schnittstelle löst Ausnahme (generische COM Ausnahme 0x80020009) wenn über IDispatch aufgerufen wird. Wenn Sie V-Tabelle verwenden Die Bindung an UpdateNotify ist erfolgreich. Ich weiß nicht wirklich, ob es so ist ist ein Fehler in Excel 12 oder einem Feature. "
Bisher konnte ich dies nicht anhand der MSDN-Informationen bestätigen ... Aber wenn das stimmt, erklärt es das Problem, das gesehen wird. Viele älter Beispiele im Web, und pywin32 + makepy behandeln diese Schnittstelle als IDispatch, und wickle es entsprechend.
Ich denke nicht, dass wir das mit pywin32 so beheben können, wie es jetzt ist. Meine Verständnis ist, dass es auf IDispatch-Unterstützung beruht. Müssen Sie sehen müssen comtypes (http://starship.python.net/crew/theller/comtypes/) um den (neu?) IRTDUpdateEvent-Objekte oder vielleicht eine C-Erweiterung. : (
Um dieses Problem zu umgehen, habe ich ein neues Projekt auf github für Pythoncom-Excel-Typen erstellt:
Dies beinhaltet eine leicht modifizierte Version von excelRTDServer.py
, die den neuen Typ PyIRTDUpdateEvent
anstelle des win32com
makepy Wrappers verwendet, und so funktioniert es jetzt in Excel 2010 (sucht nach den Kommentaren 'EXCELTYPES_MODIFICATION'
in exceltypes/demos/excelRTDServer.py
).
Um das Projekt zu erstellen, müssen Sie Visual Studio installiert haben (es wird nicht mit gcc erstellt) und Sie können es mit der im Projekt enthaltenen Datei setup.py wie folgt erstellen:
%Vor% Wenn Sie erzwingen müssen, Visual Studio anstelle von gcc zu verwenden, verwenden Sie die Option "--compiler=msvc"
, wenn Sie beispielsweise Anaconda verwenden.
Wenn Sie Visual Studio 2012 anstelle von Standard 2010 verwenden möchten, fügen Sie folgende Zeilen zu setup.py
hinzu:
Python:
Ich bekomme "Dieses COM-Objekt kann den makepy-Prozess nicht automatisieren - bitte führen Sie makepy manuell für dieses Objekt aus", aber ich habe bereits makepy für die Microsoft Excel 12.0-Objektbibliothek (1.6) ausgeführt.
Gestern bei der Arbeit nach einer Weile beim Lesen Ihrer Frage, ich habe vergessen, dass das Python und nicht Java ist :)) .. Nun, das einzige, was ich denke, ist, dass scheint, dass Sie die PIA für Office 2010.
Bearbeiten Sie später: Wenn Sie nach dem, was ich Ihnen gesagt habe, Probleme haben, kommentieren Sie bitte und nicht runter, weil dieses Problem ungewöhnlich ist.
JAVA:
Dies passiert, weil die Option zum Erstellen von v-tables fehlt.
Sie müssen die Methode ServerStart ändern und auch IRTDServer
interface und IRTDServer_Impl class
., also CallbackObject
ist COMIUnknown
. Dann müssen Sie die Klasse IRTDServer_Skel
generieren, indem Sie den IBuilder ausführen.
Jetzt können Sie einen neuen Java-Wrapper für IRTDUpdateEvent
generieren, um v-table anzufordern: