在Python中可以怎样使用COM/ActiveX?
我看到有人说可以用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()