2009-06-30 5 views
26

Ich denke, dass ich monatliche Berichte in Crystal Reports ausführen muss. Ich habe gelesen, dass Sie dies mit COM/ActiveX automatisieren können, aber ich bin nicht so weit fortgeschritten, um zu verstehen, was das ist oder was Sie damit machen können.Was können Sie mit COM/ActiveX in Python machen?

Ich bin ziemlich vertraut mit Python und es sieht aus wie das, was ich gelesen habe, könnte ich in der Lage sein, den Bericht zu öffnen, vielleicht einige Parameter ändern, es ausführen und exportieren.

Ich auch eine Menge Arbeit mit Excel und es sieht so aus, als ob Sie auch COM/ActiveX verwenden, um damit zu interagieren.

Kann jemand erklären, wie das funktioniert und vielleicht ein kurzes Beispiel geben?

Antwort

31

Zuerst müssen Sie das wunderbare Modul pywin32 installieren.

Es bietet COM-Unterstützung. Sie müssen das Dienstprogramm makepy ausführen. Es befindet sich unter C: ... \ Python26 \ Lib \ site-packages \ win32com \ client. Unter Vista muss es mit Administratorrechten ausgeführt werden.

Dieses Dienstprogramm zeigt alle verfügbaren COM-Objekte an. Sie können Ihre suchen und es wird ein Python-Wrapper für dieses Objekt generiert.

Der Wrapper ist ein Python-Modul, das im Ordner C: ... \ Python26 \ Lib \ site-packages \ win32com \ gen_py generiert wird. Das Modul enthält die Schnittstelle der COM-Objekte. Der Name der Datei ist die eindeutige COM-ID. Wenn Sie viele Dateien haben, ist es manchmal schwierig, den richtigen zu finden.

Danach müssen Sie nur die richtige Schnittstelle aufrufen. Es ist magisch :)

Ein kurzes Beispiel mit 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

Wenn Sie Fehler über die Dinge sind nicht immer registriert zu sein, stellen Sie sicher, dass Sie 32-Bit-Python verwenden, wenn Sie 32 verwenden Bit-COM-Objekte. http://python.6.x6.nabble.com/Problem-using-win32com-client-Dispatch-on-Win7-64bit-td1957248.html – Gourneau

+0

"Import Pythoncom" ist nicht erforderlich – user327843

+0

Ich reparierte die "Pythoncom-Import" ist nicht erforderlich – luc

3

Sie können das Äquivalent der späten Bindung grundsätzlich tun. Was auch immer durch IDispatch verfügbar gemacht wird, kann konsumiert werden.

Hier ist ein Code, den ich an diesem Wochenende geschrieben habe, um ein Bild von einem Twain-Gerät über Windows Image Acquisition 2.0 zu erhalten und die Daten in eine gtk-basierte Benutzeroberfläche zu übertragen.

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 

Es ist nicht schön, aber es funktioniert. Ich würde behaupten, dass es dem entspricht, was Sie in VB schreiben müssten.

1

Hier ist eine Arbeitslösung, die eine Datei erstellt und steigert den Wert einer Zelle:

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