Что вы можете сделать с COM / ActiveX в Python?[закрыто]
-
21-08-2019 - |
Вопрос
Я читал, что в Crystal Reports можно автоматизировать ежемесячные отчеты с помощью COM / ActiveX.Я не настолько продвинут, чтобы понять, что это такое и что вы вообще можете с этим сделать.
Я также много работаю с Excel, и, похоже, вы также используете COM / ActiveX для взаимодействия с ним.
Кто-нибудь может объяснить, как это работает, и, возможно, привести краткий пример?
Решение
Сначала вы должны установить замечательную pywin32 модуль.
Он обеспечивает поддержку COM.Вам нужно запустить makepy
полезность.Он расположен по адресу C:\...\Python26\Lib\site-packages\win32com\client
.В Vista он должен запускаться с правами администратора.
Эта утилита покажет все доступные COM-объекты.Вы можете найти свой, и он сгенерирует оболочку python для этого объекта.
Оболочка - это модуль python, сгенерированный в C:\...\Python26\Lib\site-packages\win32com\gen_py
папка.Модуль содержит интерфейс COM-объектов.Имя файла - это уникальный идентификатор COM.Если у вас много файлов, иногда бывает трудно найти нужный.
После этого вам просто нужно вызвать нужный интерфейс.Это волшебно :)
Краткий пример с Excel
import win32com.client
xlApp = win32com.client.Dispatch("Excel.Application")
xlApp.Visible=1
workBook = xlApp.Workbooks.Open(r"C:\MyTest.xls")
print str(workBook.ActiveSheet.Cells(i,1))
workBook.ActiveSheet.Cells(1, 1).Value = "hello"
workBook.Close(SaveChanges=0)
xlApp.Quit()
Другие советы
В принципе, вы можете сделать эквивалент поздней привязки.Таким образом, все, что доступно через IDispatch, может быть использовано.
Вот некоторый код, который я написал в эти выходные, чтобы получить изображение с устройства twain через Windows Image Acquisition 2.0 и поместить данные во что-то, что я могу вставить в пользовательский интерфейс на основе gtk.
WIA_COM = "WIA.CommonDialog"
WIA_DEVICE_UNSPECIFIED = 0
WIA_INTENT_UNSPECIFIED = 0
WIA_BIAS_MIN_SIZE = 65536
WIA_IMG_FORMAT_PNG = "{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}"
def acquire_image_wia():
wia = win32com.client.Dispatch(WIA_COM)
img = wia.ShowAcquireImage(WIA_DEVICE_UNSPECIFIED,
WIA_INTENT_UNSPECIFIED,
WIA_BIAS_MIN_SIZE,
WIA_IMG_FORMAT_PNG,
False,
True)
fname = str(time.time())
img.SaveFile(fname)
buff = gtk.gdk.pixbuf_new_from_file(fname)
os.remove(fname)
return buff
Это некрасиво, но это работает.Я бы сказал, что это эквивалентно тому, что вам пришлось бы написать в VB.
Вот рабочее решение, которое создает файл и добавляет значение в ячейку:
import win32com.client
import xlsxwriter
import os
cwd = os.getcwd()
file_path = cwd + "\\test.xlsx"
#Create an excel file
workbook = xlsxwriter.Workbook(file_path)
worksheet = workbook.add_worksheet()
workbook.close()
#Open an excel application
xlApp = win32com.client.Dispatch("Excel.Application")
xlApp.Visible=1
workBook = xlApp.Workbooks.Open(file_path)
print str(workBook.ActiveSheet.Cells(1,1))
workBook.ActiveSheet.Cells(1, 1).Value = "hello55"
workBook.Close(SaveChanges=1)
xlApp.Quit()
Как получать события ActiveX в python 3
# coding=utf8
from PyQt5.QAxContainer import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import QObject
import sys
TITLE = "CallX Python Example: accept any calls"
TrueConfCallX_Class = '{27EF4BA2-4500-4839-B88A-F2F4744FE56A}'
SERVER = '' # empty - connect to TrueConf Online cloud
USER = '<trueconf id>'
PASSWORD = '<password>'
class CallXWindow(QWidget):
def __init__(self):
QAxWidget.__init__(self)
self.setWindowTitle(TITLE)
self.move(400, 30)
# end of class CallXWindow(QWidget)
class ActiveXExtend(QObject):
def __init__(self, view):
super().__init__()
self.view = view
self.ocx = QAxWidget(TrueConfCallX_Class)
self.ocx.move(0, 0)
self.ocx.setFixedSize(640, 375)
self.ocx.setParent(self.view)
self.ocx.show()
# receive some ActiveX events
self.ocx.OnXAfterStart.connect(self._OnXAfterStart)
self.ocx.OnServerConnected[str].connect(self._OnServerConnected)
self.ocx.OnLogin[str].connect(self._OnLogin)
self.ocx.OnInviteReceived[str].connect(self._OnInviteReceived)
self.ocx.OnXError[int, str].connect(self._OnXError)
self.ocx.OnXLoginError[int].connect(self._OnXLoginError)
# Events
def _OnXAfterStart(self):
print("**OnXAfterStart")
# select devices
self.ocx.XSetCameraByIndex(0)
self.ocx.XSelectMicByIndex(0)
self.ocx.XSelectSpeakerByIndex(0)
# connect to server
self.ocx.connectToServer(SERVER)
def _OnServerConnected(self, eventDetails):
print("**OnServerConnected")
print(eventDetails)
# login
self.ocx.login(USER, PASSWORD)
def _OnLogin(self, eventDetails):
print("**OnLogin")
def _OnInviteReceived(self, eventDetails):
print("**OnInviteReceived")
print(eventDetails)
# accept any calls
self.ocx.accept()
def _OnXError(self, errorCode, errorMsg):
print("**OnXError")
print('{}. Code: {}'.format(errorMsg, errorCode))
def _OnXLoginError(self, errorCode):
print("**OnXLoginError")
if errorCode == 8:
print('Support for SDK Applications is not enabled on this server')
else:
print('Login error. Code: {}'.format(errorCode))
# end of class ActiveXExtend(QObject)
if __name__ == '__main__':
app = QApplication(sys.argv)
MainWindow = CallXWindow()
axwin = ActiveXExtend(MainWindow)
MainWindow.show()
sys.exit(app.exec_())