代码之家  ›  专栏  ›  技术社区  ›  mandroid

在python中,可以对com/activex做什么?[关闭]

  •  30
  • mandroid  · 技术社区  · 16 年前

    我已经读到使用COM/ActiveX可以自动生成Crystal Reports中的月度报告。我不太了解这是什么,或者你能用它做什么。

    我也用Excel做了很多工作,看起来你也用COM/ActiveX来与它接口。

    有人能解释一下这是如何工作的吗?也许能举个简单的例子?

    4 回复  |  直到 6 年前
        1
  •  37
  •   Christian    7 年前

    首先你必须安装好 pywin32 模块。

    它提供COM支持。你需要运行 makepy 实用工具。它位于 C:\...\Python26\Lib\site-packages\win32com\client . 在Vista上,它必须以管理员权限运行。

    此实用程序将显示所有可用的COM对象。您可以找到您的,它将为此对象生成一个Python包装器。

    包装器是在 C:\...\Python26\Lib\site-packages\win32com\gen_py 文件夹。该模块包含COM对象的接口。文件名是COM唯一ID。如果有许多文件,有时很难找到正确的文件。

    之后,您只需调用正确的接口。它很神奇:)

    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()
    
        2
  •  3
  •   Tom Willis    16 年前

    基本上,您可以执行相当于后期绑定的操作。所以任何通过IDispatch暴露的东西都可以被消耗掉。

    这是我这个周末写的一些代码,通过Windows Image Acquisition 2.0从twain设备获取图像,并将数据放入基于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编写的内容。

        3
  •  1
  •   Valentyn    8 年前

    下面是一个工作解决方案,它创建一个文件并为单元格添加值:

     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()
    
        4
  •  0
  •   Andrey Zobov    6 年前

    如何在Python3中接收ActiveX事件

    # 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_())