2012-04-03 5 views
8

Tôi đã có excelRTDserver.py và chạy trong Excel 2010 (32 bit) bằng cách thay đổi giá trị EXCEL_TLB_MINOR thành 7. Tôi có thể thấy máy chủ trong danh sách bổ trợ và nếu tôi nhập =RTD("Python.RTD.TimeServer","","seconds","5") vào một ô, tôi sẽ nhận được thời gian hiện tại. Nhưng nó không bao giờ cập nhật. Nếu tôi thay đổi "5" sang một số khác, tôi nhận được bản cập nhật nhưng sau thay đổi ban đầu, nó sẽ không bao giờ thay đổi nữa.Máy chủ Excel RTD bằng Python không cập nhật dữ liệu

Làm cách nào để cập nhật? Tôi tìm thấy người khác có vấn đề tương tự here, nhưng không có giải pháp.

CẬP NHẬT: Tôi có thêm một chút nữa - có một ngoại lệ được nêu trong ServerStart khi truyền đối tượng gọi lại PyIDispatch vào đối tượng gọi lại IRTDUpdateEvent. Sử dụng this method để nắm bắt thông báo lỗi, tôi nhận được "Không thể tạo tệp khi tệp đó đã tồn tại". Nếu tôi làm theo đề nghị here và sử dụng win32com.client.CastTo(CallbackObject,'IRTDUpdateEvent') Tôi nhận được "đối tượng COM này không thể tự động hóa quy trình makepy - hãy chạy makepy thủ công cho đối tượng này", nhưng tôi đã chạy makepy cho Thư viện đối tượng Microsoft Excel 12.0 (1.6).

Mọi trợ giúp sẽ được đánh giá cao.

Trả lời

3

Tôi nghĩ rằng bạn có thể gặp may.

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

Thông điệp rằng đây là để đáp ứng với mô tả chính xác vấn đề của bạn, và đó là gần đây, vì vậy có thể bạn đã có thông tin này trực tiếp, nhưng trong trường hợp bạn đã không ...

Tôi lo sợ rằng mọi thứ với IRTDUpdateEvent đã thay đổi với phiên bản gần đây của excel (vì Excel 2007? Tôi đoán rằng không phải như vậy 'gần đây' nữa ...).

Trong khi săn bắn xung quanh cho tin tức về thay đổi giao diện, tôi tình cờ gặp chủ đề này trong một diễn đàn java:

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

Phần mà tôi lo lắng là nhận xét này:

"Rõ ràng trong Excel 12 (Excel 2007) đối tượng gọi lại RTD rằng triển khai giao diện IRTDUpdateEvent kép ném ngoại lệ (chung COM ngoại lệ 0x80020009) khi được gọi qua IDispatch. f bạn sử dụng bảng v ràng buộc cuộc gọi đến UpdateNotify thành công. Tôi thực sự không biết liệu nó là một lỗi trong Excel 12 hoặc một tính năng."

Cho đến nay tôi vẫn chưa thể xác nhận điều này với các thông tin MSDN ... Nhưng nếu điều này là đúng Nhiều ví dụ cũ hơn là trên web, và pywin32 + makepy coi giao diện này là IDispatch, và bọc nó theo đó.

Tôi không nghĩ chúng ta có thể sửa lỗi này bằng pywin32 Hiện tại, sự hiểu biết của tôi là là dựa trên hỗ trợ IDispatch. Có thể cần xem các loại comtypes (http://starship.python.net/crew/theller/comtypes /) để bọc các đối tượng IRTDUpdateEvent (mới?) hoặc có thể là phần mở rộng C. :(

+0

Vâng, tôi đã đăng câu hỏi ở đó. Có vẻ như tôi không may mắn. – MatlabSorter

1

Python:

tôi nhận được "đối tượng COM này không thể tự động quá trình makepy - hãy chạy makepy bằng tay cho đối tượng này", nhưng tôi đã chạy makepy cho Microsoft Excel 12.0 Object Library (1.6) .

Hôm qua tại nơi làm việc sau một thời gian đọc câu hỏi của bạn, tôi quên đó là python chứ không phải java :)) .. Vâng, điều duy nhất tôi nghĩ bây giờ là có vẻ như bạn cần chạy PIA cho văn phòng 2010.

Chỉnh sửa sau: nếu thép của bạn có vấn đề sau những gì tôi đã nói với bạn., Xin vui lòng bình luận và không downvote, bởi vì vấn đề này là không phổ biến.

JAVA:

này xảy ra vì thiếu tùy chọn để tạo ra v-bảng.

Bạn cần phải sửa đổi ServerStart phương pháp và cũng IRTDServer giao diện và IRTDServer_Impl class., Vì vậy CallbackObjectCOMIUnknown. Sau đó, bạn cần tạo lớp IRTDServer_Skel bằng cách chạy IBuilder.

Bây giờ bạn có thể tạo một wrapper java mới cho IRTDUpdateEvent để yêu cầu v-bảng:

enter image description here

+0

Cảm ơn bạn đã phản hồi, nó được đánh giá cao. Tuy nhiên, tôi đang tìm một giải pháp Python. Đáng buồn là tôi không thông thạo Java. – MatlabSorter

+0

Tôi cập nhật câu trả lời của mình. –

+0

Kẻ tuyệt đối không phải là tôi, tôi yêu cầu giúp đỡ và bạn đang cho nó.Thật không may, tôi đã cài đặt PIA nhưng nó không giúp được gì. – MatlabSorter

3

Để làm việc xung quanh vấn đề này tôi đã tạo ra một dự án mới trên github cho pythoncom trội loại:

https://github.com/pyxll/exceltypes

này bao gồm một phiên bản sửa đổi nhẹ của excelRTDServer.py có sử dụng kiểu mới PyIRTDUpdateEvent thay vì win32com trình bao bọc giả mạo, và vì vậy nó bây giờ hoạt động trong Excel 2010 (tìm kiếm các ý kiến ​​'EXCELTYPES_MODIFICATION' trong exceltypes/demos/excelRTDServer.py). dự án, bạn sẽ cần cài đặt visual studio (nó sẽ không xây dựng với gcc) và bạn có thể xây dựng nó bằng cách sử dụng setup.py bao gồm trong dự án như sau:

python setup.py install 

Nếu bạn cần phải buộc nó để sử dụng visual studio thay vì gcc sử dụng tùy chọn "--compiler=msvc", nếu bạn đang sử dụng anaconda chẳng hạn. Nếu bạn muốn sử dụng Visual Studio 2012 thay vì mặc định 2010 thêm những dòng sau đây để setup.py:

from distutils import msvc9compiler 
msvc9compiler.VERSION = 11 
0

Đó thông báo lỗi đôi khi được nâng lên khi u đặt nó trong một cái gì đó như 'for'-loop, đây là một giải pháp hack 4u: thời gian nhập và sử dụng 'sleep()' trong vòng lặp của bạn