Saltar al contenido

Python en Excel!


digitalboy

Recommended Posts

publicado

Hola!

Hace no mucho publique algo acerca de python de un reto de programacion, en el cual lamentablemente no pude continuar... esa ya es otra historia que conocen mejor Macro Antonio y Cacho!

Hoy! quiero compartir con ustedes este complemento que encontre para excel 2003 y 2007 y que sirve para crear scripts Python que se ejecutan en Excel.

Wow es una maravilla! algo recortado pero muy emocionante e interesante!

Este es el link de donde pueden descargarlo:

DiscoveryScript - Xefion

En la pagina viene un ejemplo sencillo de su instalacion, funcionamiento y un pequeño script de ejemplo!

Con esta utilidad, ya disponemos de otro lenguaje de programacion para efectuar nuestra labores diarias. Tendremos a la mano las estructuras y herramienta que python nos proporciona para hacer nuestra mas facil.

Siento que no es comparable en cuanto al IDE de VBA que proporciona Excel y su gran InteliSense pero bien vale el esfuerzo aprender algo de python!

Ahora por el momento les dejo este ejemplo para que lo prueben en la consola de python del complemento (Python Console):


ws = excel.ActiveSheet

for i in range(1,101): ws.Cells[i,1].Value2 = i
[/PHP]

El programa anterior rellena del 1-100 de A1:A100

Asi mismo les dejo este manual de python:

Aprenda a Pensar Como un Programador con Python [PDF] y F.A.Q | ANIME LINUX STYLE IN THE WORLD

Puede que algunas cosas no funcionen de ese manual ya que el complemento utiliza IronPython 1.1 el cual fue la version que Microsoft desarrollo por su cuenta, pero aun asi sera de gran utilidad. Aun asi pongo este otro link el cual es sobre IronPython, lo malo es que esta en Ingles:

Contents - IronPython Cookbook

  • 2 months later...
publicado

Hola a todos!

Quise reutilizar este post para no crear uno nuevo. Wow he ido haciendo interesantes descubrimientos de Python y la manera de como combinarlos con Excel...

En mi blog: http://mexcel.wordpress.com/

Estare publicando... espero que semana a semana articulos donde pueda mostrar el uso de nuevas herramientas con Excel y Python. Por el momento estoy publicando una serie de articulos para el aprendizaje de python y mas adelante la sinergia de Python/Excel

publicado

En todo este tiempo he pubicado los siguientes articulos.

1. Python y Excel « MeXcel Plus

2. Python: Introducción « MeXcel Plus

3. ¿Por que aprender Python? « MeXcel Plus

4. Instalación de Python y las extensiones win32 « MeXcel Plus (incluye video tutorial)

5. Curso de programación Python en Video « MeXcel Plus

Espero poder publicar ejemplos mas enfocados a la manipulacion de excel en las siguientes semanas si el tiempo me lo permita entre otras herramientas mas.

  • 2 weeks later...
publicado

Hola!

http://mexcel.wordpress.com/2012/01/25/manipulando-excel-con-python-parte-i/

En ese enlace muestro un ejemplo básico de como acceder a VBA/Excel desde Python, espero que este sea el primero de muchos ejemplos útiles y prácticos de la combinación de dos fantásticas herramientas! La verdad es que estoy emocionado ya que día a día aprendo mas cosas sobre python y lo fácil que es... hoy aprendí a crear archivos zip utilizando solo 4 lineas de código, pueden creerlo? cool! Mas adelante en mi blog y si el tiempo me lo permite seguiré publicando mas cosas.

  • 5 weeks later...
publicado

Ya estoy de vuelta! Esta vez con la siguiente aportación sobre el filtrado de valores únicos:

Manipulando Excel con Python

En este ejemplo comparo el rendimiento de usar el filtro avanzado para obtener los valores únicos de un listado de cien mil números y el mismo proceso pero realizado en python.

Mis observaciones: el advancedfilter como objeto integrado es mas sencillo de utilizar solo se emplea una linea de codigo, en comparación con python en el cual me lleve alrededor de 30 lineas de codigo! pero en cuanto al rendimiento python hizo gala de su potencia, en menos de 7 segundos ya tenia los valores únicos del listado.

Corro la macro con el listado que pongo a su disposición en mi blog y se queda pensando, realmente no se cuanto tiempo demora o sera mi nueva netbook? sera que el procesador centrino tiene menor rendimiento que un atom de doble núcleo? no lo se! hojala alguien pueda echarle un ojo a la macro y ver que onda.

Seria magnifico lograr una mayor integración entre Python y Excel, sigo estudiando en ello. Próximamente espero poder explicar como hacer uso de los métodos de pyton en Excel. Hasta Pronto!

  • 5 months later...
publicado

Después de un tiempo de ausencia en este tema, vengo de regreso con dos nuevas herramientas que acabo de encontrar para poder trabajar e integrar de una manera mas fácil Python dentro de Excel.

Estas dos herramientas son Pyxll y Datanitro, ambas son versiones beta pero que no tienen liomitante en cuanto al tiempo de uso.

Pyxll permite crear complementos para Excel pero los cuales son programado utilizando el lenguaje Python. Tambien nos permite crear UDF, macros y menus de opciones y funciona para las versiones 2003 a 2010. Lo unico que necesitaremos es tener instalado un interprete Python el cual puede ir desde la version 2.3 a la 2.7 y con esto podremos utilizar Pyxll

DataNitro se integra dentro de Excel y tiene la ventaja de que ya incorpora un interprete de Python (Ver 2.7), DataNitro nos brindara un editor para redactar nuestros scripts en Python, un shell para poder ejecutar instrucciones Python y ver los resultados en tiempo real y al posibilidad de importar scripts para su ejecución en Excel. Se requiere el .Net FrameWork 3.5 para que DataNitro pueda funcionar a la perfección.

Espero que se den la oportunidad de probar estas dos herramientas que estoy seguro son de gran utilidad. Python proporciona gran cantidad de modulos de tiempo, gráficos, sonido, matemáticos, estadísticos, bases de datos, redes y muchos más con los cuales se pueden ampliar el poder de Excel.

De los dos anteriores... DataNitro es en mi opinión el mas fácil y practico de usar ya que instala casi todo y no necesitamos descargarnos ningún interprete python.

Estos son los enlaces:

Pyxll – Programación Python para Excel

DataNitro – Integrando Python a Excel

publicado

Buenas digitalBoy

Tu maquina no es tan mala, en tu comentario pones que te tarda 201.23 segundos, a mi me tarda 250.

He hecho un procedimiento que hace lo mismo en 7 segundos, eso si, no respeta el orden, deja el listado final ordenado.

He intentado subir el archivo pero no me ha dejado, no se como te las habras ingeniado para subirlo ocupando mas de 1 mega, de todas formas dejo el codigo. He puesto los mismos rangos para que solo tengas que copiarlo y pegarlo en tu hoja.

Sub pruebas_verzulsan()
Dim rOrigen As Range, rDestino As Range
Set rOrigen = Range("a1:a100000")
Set rDestino = Range("d1")
Dim p As Range, q As Range

ini = Timer

Set rDestino = Range(Cells(rDestino.Row, rDestino.Column), Cells(rDestino.Row - 1 + rOrigen.Rows.Count, rDestino.Column))
rOrigen.Copy Destination:=rDestino
Call Ordenar(ActiveSheet, rDestino)
Application.ScreenUpdating = False
For Each p In rDestino
Set q = Cells(p.Row + 1, p.Column)
If p = q Then p.Clear
Next
Call Ordenar(ActiveSheet, rDestino)
Application.ScreenUpdating = True

fin = Timer
MsgBox "Teimpo Requerido: " & (fin - ini) & " segundos!", vbInformation
End Sub

Sub Ordenar(queHoja As Worksheet, queRango As Range)
queHoja.Sort.SortFields.Clear
queHoja.Sort.SortFields.Add Key:=queRango, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With queHoja.Sort
.SetRange queRango
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
[/CODE]

Saludos

publicado

Tu maquina no es tan mala, en tu comentario pones que te tarda 201.23 segundos, a mi me tarda 250.

He hecho un procedimiento que hace lo mismo en 7 segundos, eso si, no respeta el orden, deja el listado final ordenado.

He intentado subir el archivo pero no me ha dejado, no se como te las habras ingeniado para subirlo ocupando mas de 1 mega, de todas formas dejo el codigo. He puesto los mismos rangos para que solo tengas que copiarlo y pegarlo en tu hoja.

Hola verzulsan!

En cuanto a mi maquina... esa macro la hice con una netbook que tenia un rocesador Intel® Atom™ Z520/Z530 (doble núcleo), ups! no recuerdo a cuantos Mgz y después la vendí y compre una X340 la cual pesa lo mismo 1.3 kg y una pantalla mas grande de 13.3 pulgadas pero no le preste atención al procesador y resulto ser un Intel Core de un nucle a 1.4 Mgz y acabo de ejecutar la macro y se tarda 430 segundos! jajaja esta mas lenta!

Mas sin encambio probe tu macro y esta tardo 4.58 segundos! Wow eres genio! Te la rifas!

Yo quería demostrar que el objeto advancedFilter es mas fácil de manejar no siempre es mas rápido dependiendo la cantidad de datos y la dispersión del conjunto de los mismos, tal vez recuerdes este tema: Contar Unicos

Tu has demostrado que un buen algoritmo puede ser mas rápido que un objeto de propósito general como el advancedFilter. Me quito el sombrero ante ti! Es aquí cuando me vienen las palabras de un colega: "Cual es el mejor lenguaje de programación? Es aquel al que se le pueda extraer la mayor ventaja y con el que uno se desenvuelva mejor!"

Aun que... viendo tu algoritmo me parece que se puede mejorar si lo trabajas en memoria ya que el acceder a cada celda es lento!

También probé el script de Python el cual copie de mi blog y tiene errores ya que al subirlo al blog me cambio las ' por ` y así no corría, haré las modificaciones y lo pondré para que lo descarguen y lo ejecuten. Pero ahora que lo corrí se tarda 0.9 segundos en extraer los valores únicos sin ordenarlos.

Mas tarde espero subir tu código mejorado y hacer las modificaciones en mi blog, Saludos!

- - - - - Mensaje combinado - - - - -

Lo prometido es deuda! Aquí tienes tu código optimizado:


Sub Unicos_Optimizado()
Dim rng As Range
Dim datos As Variant
Dim i As Long
Dim tempo As Double


tempo = Timer
Range("A1").CurrentRegion.Copy Range("D1")
Range("D1").CurrentRegion.Sort Range("D1"), xlAscending, Header:=xlYes
Set rng = Range("D1").CurrentRegion


datos = rng
For i = 2 To UBound(datos) - 1
If datos(i + 1, 1) = datos(i, 1) Then
datos(i, 1) = vbNullString
End If
Next i


rng = datos
rng.Sort rng.Item(1), xlAscending, Header:=xlYes
MsgBox Timer - tempo & " segundos!"
End Sub
[/CODE]

Ahora solo me toma 1.5 segundos! (una mejora sustancial) contra los 0.98 segundos que le toma Python, creo que si modifico el script Python llegaría al mismo tiempo o quizás lo rebasaría...

publicado

Guau muy buen trabajo, va bastante rapido, 0.9 segundos me tarda.

Me ha gustado mucho el estilo con que has manejado los datos, no sabia que se podia usar esa combinacion de Variant y Range para transferir datos de manera tan facil.

datos = rng
.....
rng = datos.[/CODE]

Suerte rebasando esa marca con el script de Python.

Un saludo.

  • 2 months later...
publicado

Hola!

Ya de regreso, esta vez con el codigo Python de como crear un servidor COM desde python para poder llamar objetos de python desde VBA/Excel, por el momento es un ejemplo muy sencillo pero es la base de cosas mas interesantes...

Mi siguiente paso es poder crear un objeto que permita comprimir y descomprimir archivos .zip directamente desde VBA/Excel

[h=2]Creacion de un servidor COM desde Python[/h]

publicado

Excelente ejemplo Digitalboy, revise tu pagina y me agrado la publicacion sobre arduino, FELICITACIONES !!, ojala continues publicando mas temas sobre arduino.

Saludos.

jmollan

publicado

Excelente ejemplo Digitalboy, revise tu pagina y me agrado la publicacion sobre arduino, FELICITACIONES !!, ojala continues publicando mas temas sobre arduino.

Muchas gracias! Desde hace un tiempo me he apartado del tema de arduino... el trabajo y ademas estar estudiando cosas (Python, C, VBA/Excel, Estadistica y otras cosas que no tienen que ver con la informatica...) apenas me da tiempo jajaja.

Tratare de de hacerme un espacio, no puedo prometer nada y ver si publico algo sobre el sensor de temperatura o alguna otra practica con arduino y VBA/Excel

Saludos

publicado

Esta es mi nueva aportacion al tema Excel/Python

Xefion – DiscoveryScript « MeXcel Plus

Proximanete espero estar subiendo mas ejemplos aplicados a esta herrmienta para poder manipular datos en una hoja de excel y mostrar las ventajas del uso de Python en Excel

- - - - - Mensaje combinado - - - - -

Empezare a escribir una serie de articulos con ejemplos y ejercicios sobre DiscoveryScript para mostrar algunas de las ventajas o diferencias de la programacion Python con el modelo de objetos de Excel...

Este es el primero de ellos:

http://mexcel.wordpress.com/2012/11/18/discoveryscript-jugando-con-la-consola/

Espero sea de su agrado, tratare de redactarlo de forma amena y comprensible, pero debo hacer la aclaracion que se debe estar familiarizado con el modelo de objetos de Excel.

Saludos!

  • 2 years later...
publicado

una consulta estoy haciendo un macro en excel :

@xl_macro()

def mmprueba():

hoja_00=xl_app()

matriz_datos=hoja_00.Selection

A=[]

for i in matriz_datos:

for j in i:

A.append(j)

B=array(A)

C=B.reshape(len(B)/7,7)

Datos_X0=[]

for i in range(len(B)/7):

Datos_X0.append(C[0])

Datos_Y0=[]

for i in range(len(B)/7):

Datos_Y0.append(C[1])

Datos_Xf=[]

for i in range(len(B)/7):

Datos_Xf.append(C[2])

Datos_Yf=[]

for i in range(len(B)/7):

Datos_Yf.append(C[3])

Datos_A=[]

for i in range(len(B)/7):

Datos_A.append(C[4])

Datos_E=[]

for i in range(len(B)/7):

Datos_E.append(C[5])

Datos_I=[]

for i in range(len(B)/7):

Datos_I.append(C[6])

numeros=len(B)/7

K_total=[]

Prueba_MM=hoja_00.Range('A1')

for i in range(numeros):

K_total=K_total+[Matrix2D(Datos_X0,Datos_Y0,Datos_Xf,Datos_Yf,Datos_E,Datos_I,Datos_A).Mat()]

Prueba_MM.Value=numeros

Pero no se por que no funka la parte de Matrix2D

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.