2009-06-30 26 views
26

Estoy pensando que voy a tener que ejecutar informes mensuales en Crystal Reports. He leído que puede automatizar esto con COM/ActiveX, pero no estoy tan avanzado para comprender qué es esto o qué puede hacer con él.¿Qué se puede hacer con COM/ActiveX en Python?

estoy bastante familiarizado con Python y parece que por lo que he leído, yo podría ser capaz de abrir el informe, tal vez cambiar algunos parámetros, ejecutarlo, y exportarlo.

También trabajo mucho con Excel y parece que también usa COM/ActiveX para interactuar con él.

¿Alguien puede explicar cómo funciona esto y quizás proporcionar un breve ejemplo?

Respuesta

31

Primero tienes que instalar el maravilloso módulo pywin32.

Proporciona compatibilidad con COM. Necesita ejecutar la utilidad makepy. Se encuentra en C: ... \ Python26 \ Lib \ site-packages \ win32com \ client. En Vista, debe ejecutarse con derechos de administrador.

Esta utilidad mostrará todos los objetos COM disponibles. Puedes encontrar el tuyo y generará un contenedor de Python para este objeto.

El contenedor es un módulo python generado en la carpeta C: ... \ Python26 \ Lib \ site-packages \ win32com \ gen_py. El módulo contiene la interfaz de los objetos COM. El nombre del archivo es el ID único de COM. Si tiene muchos archivos, a veces es difícil encontrar el correcto.

Después de eso solo tiene que llamar a la interfaz correcta. Es mágico :)

Un breve ejemplo 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

Si se producen errores acerca de las cosas que no están registrados, asegúrese de que está utilizando Python 32 bits si está utilizando 32 objetos bit com. http://python.6.x6.nabble.com/Problem-using-win32com-client-Dispatch-on-Win7-64bit-td1957248.html – Gourneau

+0

"importar pythoncom" no es necesario – user327843

+0

He solucionado el problema "importar pythoncom" no se requiere – luc

3

Básicamente puede hacer el equivalente a la vinculación tardía. Entonces, todo lo que esté expuesto a través de IDispatch puede consumirse.

Aquí hay un código que escribí este fin de semana para obtener una imagen de un dispositivo TWAIN a través de Windows Image Acquisition 2.0 y poner los datos en algo que puedo meter en una interfaz de usuario basada en 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 

No es bonito, pero funciona. Yo afirmaría que es equivalente a lo que tendrías que escribir en VB.

1

Aquí es una solución de trabajo que crea un archivo y añade valor a una celda:

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