RTD сервер Excel в Python не обновляет данные - PullRequest
8 голосов
/ 03 апреля 2012

Я получил и запустил excelRTDserver.py в Excel 2010 (32 бита), изменив значение EXCEL_TLB_MINOR на 7. Я вижу сервер в списке надстроек и, если я введу =RTD("Python.RTD.TimeServer","","seconds","5") в ячейку, я получу текущее время. Но это никогда не обновляет. Если я поменяю «5» на другое число, я получу обновление, но после первоначального изменения оно никогда не изменится.

Как мне его обновить? Я нашел кого-то еще с похожей проблемой здесь , но решения не найдено.

ОБНОВЛЕНИЕ: у меня есть немного дальше - в ServerStart возникает исключение при приведении объекта обратного вызова PyIDispatch в объект обратного вызова IRTDUpdateEvent. Используя этот метод для захвата сообщения об ошибке, я получаю «Невозможно создать файл, когда этот файл уже существует». Если я последую предложению здесь и использую win32com.client.CastTo(CallbackObject,'IRTDUpdateEvent'), я получу «Этот COM-объект не может автоматизировать процесс makepy - пожалуйста, запустите makepy для этого объекта вручную», но я уже запустил makepy для объекта Microsoft Excel 12.0 Библиотека (1.6).

Любая помощь будет принята с благодарностью.

Ответы [ 4 ]

4 голосов
/ 04 июня 2014

Чтобы обойти эту проблему, я создал новый проект на github для типов pythoncom excel:

https://github.com/pyxll/exceltypes

Это включает слегка измененную версию excelRTDServer.py, в которой вместо оболочки win32com используется новый тип PyIRTDUpdateEvent, и теперь она работает в Excel 2010 (см. Комментарии 'EXCELTYPES_MODIFICATION' в exceltypes/demos/excelRTDServer.py ).

Для сборки проекта вам потребуется установить Visual Studio (он не будет собираться с помощью gcc), и вы можете собрать его, используя setup.py, включенный в проект, следующим образом:

python setup.py install

Если вам нужно заставить его использовать visual studio вместо gcc, используйте опцию "--compiler=msvc", например, если вы используете anaconda. Если вы хотите использовать Visual Studio 2012 вместо 2010 по умолчанию, добавьте следующие строки в setup.py:

from distutils import msvc9compiler
msvc9compiler.VERSION = 11
3 голосов
/ 12 апреля 2012

Думаю, вам не повезло.

По словам автора excelRTDServer.py в недавней ветке python-win32 :

Сообщение о том, что это ответ, описывает вашу точную проблему, и она возникла недавно, поэтому, возможно, вы уже получили эту информацию напрямую, но на случай, если вы не ...

Боюсь, что вещи с IRTDUpdateEvent изменились в последних версиях из Excel (начиная с Excel 2007? Я думаю, это уже не так «недавно» ...).

Охотясь за новостями об изменениях интерфейса, я наткнулся на это нить в форуме по Java:

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

Меня беспокоит следующий комментарий:

"Как видно в Excel 12 (Excel 2007) объект обратного вызова RTD, который реализует двойное исключение бросков интерфейса IRTDUpdateEvent (универсальный COM исключение 0x80020009), когда вызывается через IDispatch. Если вы используете V-таблицу привязка вызова к UpdateNotify успешно завершена. Я не знаю, действительно ли это ошибка в Excel 12 или функция. "

Пока я не смог подтвердить это по информации MSDN ... Но если это правда, это объясняет проблему. Много старше примеры в Интернете, и pywin32 + makepy обрабатывают этот интерфейс как IDispatch, и оберните его соответственно.

Не думаю, что мы сможем исправить это с помощью pywin32, как сейчас. мой понимание заключается в том, что он опирается на поддержку IDispatch. Может нужно посмотреть на Comtipes (http://starship.python.net/crew/theller/comtypes/), чтобы обернуть (новые?) объекты IRTDUpdateEvent, или, возможно, расширение C. (

1 голос
/ 11 апреля 2012

Python:

Я получаю «Этот COM-объект не может автоматизировать процесс makepy - пожалуйста, запустите makepy для этого объекта вручную», но я уже запустил makepy для библиотеки объектов Microsoft Excel 12.0 (1.6).

Вчера на работе, через некоторое время читая твой вопрос, я забыл, что это python, а не java :)) .. Ну, единственное, что я думаю сейчас, это то, что тебе нужно запустить PIA для офис 2010.

Отредактируйте позже: если у вас возникли проблемы после того, что я вам сказал. Пожалуйста, прокомментируйте, а не понижайте голос, потому что эта проблема необычна.

JAVA:

Это происходит потому, что отсутствует опция для генерации v-таблиц .

Вам необходимо изменить ServerStart метод, а также IRTDServer интерфейс и IRTDServer_Impl class., Поэтому CallbackObject равно COMIUnknown. Затем вам нужно сгенерировать класс IRTDServer_Skel, запустив IBuilder .

.

Теперь вы можете сгенерировать новую оболочку Java для IRTDUpdateEvent для запроса v-таблицы:

enter image description here

0 голосов
/ 23 декабря 2014

Это сообщение об ошибке иногда возникает, когда вы помещаете его в цикл типа «for», вот хакерское решение 4u: импортируйте время и используйте «sleep ()» в цикле

...