Python中的Excel RTD服务器不更新数据

通过将EXCEL_TLB_MINOR值更改为7我已经启动并运行Excel 2010(32位)的EXCEL_TLB_MINOR 。 我可以看到加载项列表中的服务器,如果我input=RTD("Python.RTD.TimeServer","","seconds","5")到一个单元格,我得到当前时间。 但它永远不会更新。 如果我将“5”更改为另一个数字,我会得到一个更新,但在初始更改之后,它不会再更改。

我如何获得更新? 我在这里发现了一个类似的问题,但没有解决scheme。

更新:我还有一点 – 在将PyIDispatchcallback对象强制转换为IRTDUpdateEventcallback对象时,ServerStart中会引发exception。 使用此方法捕获错误消息,我得到“不能创build文件时,该文件已经存在”。 如果我按照这里的build议,并使用win32com.client.CastTo(CallbackObject,'IRTDUpdateEvent')我得到“此COM对象不能自动化makepy进程 – 请为此对象手动运行makepy”,但我已经运行makepy for Microsoft Excel 12.0对象库(1.6)。

任何帮助将不胜感激。

我想你可能不走运。

根据最近的python-win32线程的excelRTDServer.py的作者 :

这是回应的消息描述你的确切问题,这是最近,所以也许你已经得到这个信息直接,但如果你没有…

我担心IRTDUpdateEvent的事情随着最近版本的Excel的变化而改变(因为Excel 2007?我想这不是最近的了)。

在四处寻找界面变化的消息时,我在java论坛中遇到了这个线程:

http://www.nevaobject.com/phpbb3/viewtopic.php?t=516

担心我的部分是这样的评论:

“显然,在Excel 12(Excel 2007)中,实现双IRTDUpdateEvent接口的RTDcallback对象在通过IDispatch调用时会引发exception(genericsCOMexception0x80020009),如果使用v-table绑定,则UpdateNotify调用成功知道这是Excel 12中的一个bug还是一个function“。

到目前为止,我还没有能够证实这与MSDN信息…但是,如果这是真的,它确实解释了看到的问题。 Web上有许多较老的例子,pywin32 + makepy把这个接口当作IDispatch,并相应地包装它。

我不认为我们现在可以用pywin32来解决这个问题。 我的理解是它依赖于IDispatch的支持。 可能需要查看comtypes(http://starship.python.net/crew/theller/comtypes/)来包装(new?)IRTDUpdateEvent对象,或者可能是一个C扩展。 🙁

为了解决这个问题,我在github上为pythoncom exceltypes创build了一个新项目:

https://github.com/pyxll/exceltypes

这包括一个稍微修改的版本的excelRTDServer.py ,它使用新的typesPyIRTDUpdateEvent而不是win32com makepy包装,所以它现在在Excel 2010中工作(在exceltypes/demos/excelRTDServer.py查找注释'EXCELTYPES_MODIFICATION' )。

要构build项目,您需要安装Visual Studio(不会使用gcc构build),并且可以使用项目中包含的setup.py来构build它,如下所示:

 python setup.py install 

如果您需要强制使用visual studio而不是gcc,请使用"--compiler=msvc"选项,例如,如果您使用的是anaconda。 如果您想使用Visual Studio 2012而不是默认的2010,请将以下行添加到setup.py

 from distutils import msvc9compiler msvc9compiler.VERSION = 11 

python:

我得到“这个COM对象不能自动化makepy进程 – 请为此对象手动运行makepy”,但是我已经运行了Microsoft Excel 12.0 Object Library(1.6)的makepy。

昨天在工作了一段时间后,你看到的问题,我忘了是python,而不是java :))..那么,我现在唯一想到的是,似乎你需要运行PIA办公室2010年。

稍后编辑:如果您的钢铁在我告诉您之后出现问题,请评论并不要低估,因为这个问题是不常见的。

JAVA:

发生这种情况是因为缺less生成v表的选项。

您需要修改ServerStart方法以及IRTDServer接口和IRTDServer_Impl class ,因此CallbackObjectCOMIUnknown 。 然后,您需要运行IBuilder来生成IRTDServer_Skel类。

现在你可以为IRTDUpdateEvent生成一个新的java包装来请求v-table:

在这里输入图像描述

这个错误消息有时会在你把它放在'for'循环中时引发,这里是一个拙劣的解决scheme4u:import time,并且在循环中使用'sleep()'