在Python中可以怎样使用COM/ActiveX?

39 投票
4 回答
51775 浏览
提问于 2025-04-15 12:36

我看到有人说可以用COM/ActiveX来自动生成Crystal Reports的月报。老实说,我对这些东西不太懂,不知道这是什么,也不知道能做些什么。

我平时也经常用Excel,听说好像也是用COM/ActiveX来和它进行交互。

有没有人能简单解释一下这个是怎么回事,顺便给个简单的例子?

4 个回答

3

这里有一个可以用的解决方案,它可以创建一个文件并在一个单元格中添加值:

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

你可以做到类似于“晚绑定”的效果。也就是说,通过IDispatch暴露出来的东西都可以被使用。

这是我这个周末写的一段代码,用来通过Windows图像采集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中需要写的代码是差不多的。

43

首先,你需要安装一个很棒的模块,叫做 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()

撰写回答