2009-06-30 13 views
26

Sto pensando che dovrò eseguire report mensili in Crystal Reports. Ho letto che puoi automatizzarlo con COM/ActiveX ma non sono così avanzato per capire cosa sia e cosa puoi fare con esso.Cosa puoi fare con COM/ActiveX in Python?

Sono abbastanza familiare con Python e sembra che da quello che ho letto, potrei essere in grado di aprire il rapporto, forse modificare alcuni parametri, eseguirlo ed esportarlo.

Anche io lavoro molto con Excel e sembra che tu usi anche COM/ActiveX per interfacciarlo con esso.

Qualcuno può spiegare come funziona e magari fornire un breve esempio?

risposta

31

Per prima cosa è necessario installare il meraviglioso modulo pywin32.

Fornisce supporto COM. È necessario eseguire l'utilità makepy. Si trova in C: ... \ Python26 \ Lib \ site-packages \ win32com \ client. Su Vista, deve essere eseguito con diritti di amministratore.

Questa utilità mostrerà tutti gli oggetti COM disponibili. Puoi trovare il tuo e genererà un wrapper python per questo oggetto.

Il wrapper è un modulo python generato nella cartella C: ... \ Python26 \ Lib \ site-packages \ win32com \ gen_py. Il modulo contiene l'interfaccia degli oggetti COM. Il nome del file è l'ID univoco di COM. Se hai molti file, a volte è difficile trovare quello giusto.

Dopodiché è sufficiente chiamare l'interfaccia corretta. E ':) magica

Un breve esempio con 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

Se hai trovato errori su cose non essere registrati, assicurarsi che si sta utilizzando 32 bit Python se si utilizza 32 bit COM oggetti. http://python.6.x6.nabble.com/Problem-using-win32com-client-Dispatch-on-Win7-64bit-td1957248.html – Gourneau

+0

"import pythoncom" non è richiesto – user327843

+0

Ho risolto il problema con "import pythoncom" non richiesto – luc

3

In pratica, è possibile eseguire l'equivalente del binding posticipato. Quindi tutto ciò che viene esposto tramite IDispatch può essere consumato.

Ecco un codice che ho scritto questo fine settimana per ottenere un'immagine da un dispositivo twain tramite Windows Image Acquisition 2.0 e inserire i dati in qualcosa che posso spingere in un'interfaccia utente basata su 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 

Non è bello ma funziona. Direi che è equivalente a ciò che dovresti scrivere in VB.

1

Ecco una soluzione di lavoro che crea un file e aggiunge valore ad una cella:

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