2009-06-30 62 views
26

我在想,我將不得不在Crystal Reports中運行每月報告。我讀過你可以使用COM/ActiveX實現自動化,但我並沒有先進的去理解它是什麼或者你甚至可以用它做什麼。如何處理Python中的COM/ActiveX?

我對Python非常熟悉,它看起來像我讀過的,我可能能夠打開報告,也許更改一些參數,運行它並導出它。

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

有人可以解釋這是如何工作的,也許提供一個簡單的例子?

回答

31

首先你必須安裝精彩的pywin32模塊。

它提供COM支持。你需要運行makepy工具。它位於C:... \ Python26 \ Lib \ site-packages \ win32com \ client中。在Vista上,它必須以管理員權限運行。

此實用程序將顯示所有可用的COM對象。你可以找到你的,它會爲這個對象生成一個python包裝器。

包裝是在C:... \ Python26 \ Lib \ site-packages \ win32com \ gen_py文件夾中生成的python模塊。該模塊包含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() 
+0

如果你得到關於未註冊的事情錯誤,請確保您使用的是32位的Python,如果你使用的是32 bit com對象。 http://python.6.x6.nabble.com/Problem-using-win32com-client-Dispatch-on-Win7-64bit-td1957248.html – Gourneau 2015-01-21 23:32:51

+0

「import pythoncom」不是必需的 – user327843 2015-03-13 08:47:13

3

你基本上可以做相當於後期綁定。所以通過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中編寫的東西。

1

下面是創建一個文件,並增加值到小區的工作方案:

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