2009-06-30 10 views
26

Je pense que je vais devoir exécuter des rapports mensuels dans Crystal Reports. J'ai lu que vous pouvez automatiser cela avec COM/ActiveX mais je ne suis pas si avancé pour comprendre ce que c'est ou ce que vous pouvez même faire avec.Que pouvez-vous faire avec COM/ActiveX en Python?

Je suis assez familier avec Python et il semble que d'après ce que j'ai lu, je pourrais être en mesure d'ouvrir le rapport, peut-être modifier certains paramètres, exécutez-le, et l'exporter. Je travaille aussi beaucoup avec Excel et il semble que vous utilisiez aussi COM/ActiveX pour l'interfacer avec celui-ci. Est-ce que quelqu'un peut expliquer comment cela fonctionne et peut-être fournir un bref exemple?

Répondre

31

Vous devez d'abord installer le merveilleux module pywin32.

Il fournit un support COM. Vous devez exécuter l'utilitaire makepy. Il se trouve dans C: ... \ Python26 \ Lib \ site-packages \ win32com \ client. Sur Vista, il doit être exécuté avec des droits d'administrateur.

Cet utilitaire affichera tous les objets COM disponibles. Vous pouvez trouver les vôtres et générer un wrapper python pour cet objet.

Le wrapper est un module python généré dans le dossier C: ... \ Python26 \ Lib \ site-packages \ win32com \ gen_py. Le module contient l'interface des objets COM. Le nom du fichier est l'ID unique COM. Si vous avez beaucoup de fichiers, il est parfois difficile de trouver le bon.

Ensuite, il vous suffit d'appeler la bonne interface. Il est magique :)

Un court exemple avec 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

Si vous obtenez des erreurs sur les choses ne sont pas enregistrés, assurez-vous que vous utilisez Python 32 bits si vous utilisez 32 objets bit com. http://python.6.x6.nabble.com/Problem-using-win32com-client-Dispatch-on-Win7-64bit-td1957248.html – Gourneau

+0

"import pythoncom" n'est pas nécessaire – user327843

+0

J'ai corrigé le "import pythoncom" non requis – luc

3

Vous pouvez essentiellement faire l'équivalent de la liaison tardive. Ainsi, tout ce qui est exposé via IDispatch peut être consommé.

Voici un code que j'ai écrit ce week-end pour obtenir une image à partir d'un périphérique Twain via Windows Image Acquisition 2.0 et mettre les données dans quelque chose que je peux pousser dans une interface utilisateur basée sur 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 

Ce n'est pas joli mais cela fonctionne. Je dirais que c'est l'équivalent de ce que vous auriez à écrire en VB.

1

Voici une solution de travail qui crée un fichier et ajoute de la valeur à une cellule:

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