Tutorial

Modificar documentos de Excel con Python

En el tutorial anterior sobre Lectura de documentos de Excel con Python trate de una manera introductoria la librería OpenPyxl en donde vimos lo mas esencial, como es la instalación de la misma y la apertura de un archivo xlsx, que posteriormente trabajamos en modo lectura a nivel de código.

Si no haz leído el tutorial anterior, te lo recomiendo...porque en esta ocasión vamos a trabajar con la lectura y modificación de un archivo de excel mediante algunos ejemplos sencillos, pero interesantes, que te ayudaran a comprender el manejo de esta librería.

Modificación básica.

Lo primero que vamos a hacer para seguir este tutorial es descargar este documento sobre el cual me voy a basar en los siguientes pasos; después de que te enseñe a manipular cierta información, puedes intentar lo mismo con algún otro documento de tu propiedad.

>>> import openpyxl
>>> doc = openpyxl.load_workbook('modificar_excel.xlsx')
>>> doc.get_sheet_names()
[u'Hoja1', u'Hoja2', u'Hoja3']

Como en tutorial pasado, lo primero es importar la librería y posteriormente abrir nuestro documento de excel en memoria mediante una variable doc para utilizarlo a lo largo de nuestro tutorial.

Modificacion excel 1

Si abrimos nuestro documento propiamente en Microsoft Excel, vamos a encontrarnos que en la Hoja1, tenemos una tabla sencilla que representa ventas de determinados productos en cantidades con relación a el periodo en Meses; ademas podemos apreciar que tenemos otras 2 hojas que no tienen contenido alguno, pero mediante el método get_sheet_names() podemos notar que están presentes y este nos lo indica en forma de listas.

Como deseamos trabajar sobre la tabla de la "Hoja1", entonces vamos a decirle a python que en una variable hoja, nos cargue toda la información relacionada a ella, de la siguiente manera:

>>> hoja = doc.get_sheet_by_name('Hoja1')

Ahora vamos a suponer que deseamos cambiar el valor 40 de la celda B2 de nuestra hoja, por un 99, solo tendríamos que hacer lo siguiente:

>>> hoja['B2'] = 99

De esta manera podemos acceder a la celda y cambiar su valor, estos pueden ser formateados según sea el caso, es decir, que podemos insertar fechas, flotantes, cadenas e incluso formulas.

Vamos a intentar cambiar el valor 99 por una formula sencilla:

hoja['B2'] = "=SUM(1, 1)"
>>> hoja['B2'].value
u'=SUM(1, 1)'

Como ven...hasta cierto punto es sencillo trabajar con la información de nuestras celdas, lo importante es mantener el mismo tipo de dato y también debemos tener en cuenta que esta librería esta hecha a base de Hacks, por lo que la inclusión de ciertas formulas mas complejas están limitadas al estado de desarrollo de la misma.

Guardar Cambios

Bien, ahora que modificamos nuestro documento de excel, vamos a guardar los cambios haciendo uso de nuestra primer variable doc, que si bien recuerdan, contiene la instancia de todo nuestro documento.

>>> doc.save("modificar_excel.xlsx")

Recuerden que el argumento del método save(), tiene que llevar el mismo nombre de nuestro archivo xlsx, si le cambiamos el nombre, OpenPyxl nos va crear un nuevo documento. Si haz conseguido llegar hasta aqui, te invito a abrir tu documento nuevamente en Microsoft Excel y veras el resultado :D.

Modificacion excel 2

Ahora vamos a ver otra interesante función que nos permite esta librería...Supongamos que deseamos agregar nueva información al final de nuestra tabla, por ejemplo "Junio, 99, 100"; lo hariamos de la siguiente manera:

>>> hoja.append(["Junio",99,100])
>>> hoja['A7'].value
u'Junio'
>>> hoja['B7'].value
99
>>> hoja['C7'].value
100

Podemos notar, que haciendo uso del método append() de la instancia de nuestra hoja, nos permite agregar una fila nueva. Este método recibe como parámetro un dato de tipo lista que debe contener la información que deseamos insertar de izquierda a derecha (siempre en ese orden).

Añadir gráfica de área.

Como ultimo paso para complementar de la mejor manera este tutorial, voy a mostrarles como crear una gráfica de área (Es posible crear casi todas las gráficas disponibles por excel mediante OpenPyxl).


Primero vamos a importar lo siguiente:

>>> from openpyxl.chart import (AreaChart, Reference, Series)

Necesitamos de esas 3 clases para poder crear nuestra gráfica, también es posible crear una gráfica 3D, solo debemos cambiar AreaChart por AreaChart3d.

Ahora debemos configurar la información de nuestra grafica, como el estilo y los distintos titulos que se muestran en el eje X, Y.

>>> grafica = AreaChart()
>>> grafica.title = "Grafica de Area"
>>> grafica.style = 13
>>> grafica.x_axis.title = "Periodo"
>>> grafica.y_axis.title = "Utilidades"

Después vamos a configurar las referencias que mostraran la información de los meses:

periodo = Reference(hoja, min_col=1, min_row=2, max_row=7)

Si analizamos nuestra hoja de calculo, tenemos que toda la columna A hace referencia a la información del periodo y es por ello que dentro del constructor del objeto Referencia, como primer argumento le indicamos la hoja que tenemos cargada, la columna mínima (es decir A) y posteriormente el rango de información de dicha columna 2-7.

Ahora es el turno de hacer lo mismo, pero a los valores de nuestros periodos

>>> utilidades = Reference(hoja, min_col=2, min_row=1, max_col=3, max_row=7)

Usando un poco de sentido común, usamos la misma clase, solo que ahora hicimos un tipo "Select" de las columnas B y C hasta la fila 7, para después almacenar toda esa información en la variable utilidades.

Lo ultimo que nos queda por hacer es agregar la información a nuestra instancia de AreaChart la cual llamamos grafica y agregar ese objeto a nuestra hoja de calculo para después guardar el documento.

>>> grafica.add_data(utilidades, titles_from_data=True)
>>> grafica.set_categories(periodo)
>>> hoja.add_chart(grafica, "A10")
>>> doc.save("modificar_excel.xlsx")

Si abrimos nuestro archivo en Microsoft Excel, vamos a encontrarnos con el resultado esperado :D

Modificacion excel 3

Notaran que no es tan complicado utilizar esta librería para ciertas situaciones no tan complejas, como les comento, la librería tiene muchas limitaciones, pero si es posible crear reportes básicos e incluso graficar contenido...se me ocurre que esto puede emplearse para exportar contenido de una base de datos a excel por poner un ejemplo!

Si desean saber mas acerca de OpenPyxl, les invito a leer la documentación que expresa prácticamente todas las funciones disponibles y como aplicarlas con ejemplos.

Saludos Cordiales!

Compartelo en:    

Acerca del Autor

Aarón Díaz R Software Developer

Soy desarrollador de software con experiencia en bases de datos y lenguajes de programación como Python, Java SE, Javascript, C y PHP.

  Comentarios



"El ser de las cosas, no su verdad, es la causa de la verdad en el entendimiento."

- Santo Tomás de Aquino