在Python中使用COM/ActiveX可以做什么?

2024-06-07 06:26:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经读过,用COM/ActiveX在Crystal reports中实现月报表自动化是可能的。我不太明白这是什么,或者你能用它做什么。

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

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


Tags: com报表excel例子crystalreportsactivex
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()

首先,您必须安装美妙的pywin32模块。

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

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

包装器是在C:\...\Python26\Lib\site-packages\win32com\gen_py文件夹中生成的python模块。模块包含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()

你基本上可以做相当于后期绑定的工作。所以通过IDispatch暴露的东西都可以被消费。

这是我本周末写的一些代码,通过WindowsImageAcquisition2.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写的东西。

相关问题 更多 >