2012-04-03 107 views
8

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

我该如何得到它来更新?我发现其他人有类似的问题here,但没有解决方案。

更新:我还有一点 - 在将PyIDispatch回调对象强制转换为IRTDUpdateEvent回调对象时,ServerStart中引发了异常。使用this method来捕获错误消息,我得到“该文件已存在时无法创建文件”。如果我按照建议here并使用win32com.client.CastTo(CallbackObject,'IRTDUpdateEvent')我得到“此COM对象无法自动执行makepy进程 - 请为此对象手动运行makepy”,但我已经为Microsoft Excel 12.0 Object Library(1.6)运行makepy。

任何帮助将不胜感激。

回答

3

我想你可能是出于运气。

According to the author of excelRTDServer.py in a recent python-win32 thread

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

我担心事情IRTDUpdateEvent与最近版本的Excel 的改变(因为Excel 2007中?我想这是不那么“近期”了...)。

虽然狩猎周围的接口变化的消息,我碰到这个 线程进来一个java论坛:

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

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

“显然,在Excel 12(Excel 2007)中,当通过IDispatch调用时, 实现双重IRTDUpdateEvent接口的RTD回调对象抛出异常(通用COM 异常0x80020009)。如果您使用v表 将呼叫绑定到UpdateNotify成功。我真的不知道它是否 是在Excel 12或功能中的错误。”

到目前为止,我一直没能证实这一点对MSDN信息... 但是,如果这是真的,它确实说明被视为问题。许多老 例子在网络上,并pywin32 + makepy把这个接口作为IDispatch接口, 并相应地把它包起来。

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

+0

是的,我也在那里发布了这个问题。它看起来像我运气不好。 – MatlabSorter 2012-04-11 23:39:08

1

的Python:

我得到 “这COM对象不能自动化makepy过程 - 请makepy手动运行该对象”,但我已经为Microsoft Excel 12.0对象库运行makepy(1.6) 。

昨天在工作一边读你的问题后,我忘了是Python和不是Java :))..好吧,我想现在唯一的事情是,看来你需要为2010年

办公室运行 PIA

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

JAVA:

这发生,因为缺少生成V-表的选项。

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

您可以生成IRTDUpdateEvent一个新的Java包装要求v表:

enter image description here

+0

感谢您的回应,非常感谢。不过,我正在寻找一个Python解决方案。可悲的是我不熟练Java。 – MatlabSorter 2012-04-11 21:33:48

+0

我更新了我的答案。 – 2012-04-12 20:46:41

+0

downvote不是我,我是在寻求帮助,而你在给它。不幸的是,我安装了PIA,但它没有帮助。 – MatlabSorter 2012-04-12 21:56:14

3

要解决这个问题,我已经创建在github上了新项目pythoncom擅长类型:

https://github.com/pyxll/exceltypes

这包括excelRTDServer.py略加修改的版本使用新的类型PyIRTDUpdateEvent而不是win32com makepy包装,所以它现在可以在Excel 2010中使用(请在exceltypes/demos/excelRTDServer.py中查找注释'EXCELTYPES_MODIFICATION')。

构建项目将需要安装Visual Studio(它不会建立与GCC),你可以使用包含在项目的setup.py如下构建它:

python setup.py install 

如果你需要迫使它使用Visual Studio例如,如果您使用anaconda,而不是gcc,请使用"--compiler=msvc"选项。 如果你想使用Visual Studio 2012而不是默认的2010年添加以下行setup.py

from distutils import msvc9compiler 
msvc9compiler.VERSION = 11 
0

该错误消息时ü把它像“for'环有时升高,这里是一个hackly解决方案4u:导入时间,并在您的循环中使用'sleep()'