miércoles, 26 de marzo de 2025

Herramientas. OpenPyXL

Biblioteca openpyxl (1). Registro de datos.

Aunque es una forma un tanto grandilocuente de expresarlo, lo cierto es que en esta entrada aprenderemos a utilizar openpyxl para automatizar el registro de datos en una hoja de cálculo; el resultado es, valga la redundancia y el juego de palabras, la creación de un registro (individual) de datos. Aun no llegamos a la creación de una tabla de datos (y por tanto tampoco a crear una base da datos), pero damos un paso adelante en esta dirección.


Para crear un registro de datos basado en un libro Excel mediante un script Python, primeramente, llamar al módulo openpyxl de creación de la hoja de cálculo mediante la instrucción from openpyxl import Workbook. Hecho esto ya estamos en disposición de crear nuestra primera hoja de cálculo mediante la función (sin parámetro) Workbook(), que asociaremos a una variable para facilitar el trabajo que viene a continuación (Hoja = Workbook()). De este modo ya hemos creado una documento Excell (accesible también desde Calc), el cual contiene una hoja, por lo que ya podemos trabajar con ella, pero te aconsejo que lo siguiente que hagas sea guardar tu trabajo mediante la función save() que, esta sí, tiene como parámetro la dirección donde guardar el documento y el propio identificador de éste (nombre y extensión), todo ello asociado a la variable con la que se identifica el documento (hoja.save("Hoja1.xlsx") -> En este caso se entiende que el documento se guarda en el mismo directorio del script python). 

Aunque una única hoja puede ser suficiente para la mayoría de las tareas, habrá ocasiones en las que necesitemos disponer de más de una. Para ello necesitamos  crear más hojas mediante código, lo que es posible y sencillo mediante la función create_sheet() que recibe como parámetro el nombre que la hoja mostrará en el libro (vg. create_sheet("Hoja2")), aunque ese nombre no se debe confundir con el nombre de la variable con la que se accede a la hoja desde el script (vg. y para complicar un poco las cosas, hoja1 = hc_uno.create_sheet("Hoja2")). De este modo podremos crear tantas hojas como deseemos, bien de forma sucesiva, bien posicionándola mediante un segundo parámetro tipo integer que indica la posición (vg hoja0 = hc_uno.create_sheet("Hoja0",0) asociada a la variable hoja0 crea una hoja de nombre Hoja0 en la posición 0, esto es, en primera posición).

También podremos cambiar el nombre visible de las hojas mediante el atributo title (hoja5 = hc_uno.create_sheet("Hoja5",-1) -> hoja5.title ='Hoja3') -> Asociada a la variable hoja5 creamos una hoja en penúltima posición a la que damos por nombre Hoja5, pero después modificamos ese nombre por Hoja3, aunque en el script deberemos seguir refiriéndonos a la hoja por su variable (hoja5).

Esta diferencia es fundamental para posicionar datos en las celdas de las hojas, ya que debemos utilizar los nombres de las variables con las que éstas están referenciadas (vg. hoja5['B1'] = 'Estas en la Hoja 3') -> escribe en la celda B1 de la Hoja3 el string 'Estas en la Hoja 3' aunque para ello usamos como referencia la variable hoja5.

La anterior es la forma más sencilla y directa de escribir contenido en una celda, pero también podemos usar la función cell() asociada a la variable con la que identificamos la hoja. Esta función recibe tres parámetros: la fila, la columna y el dato (o variable) a escribir (hoja5.cell(row=2, column=2, value='Segunda forma'))

Y hablando de columnas (column) y filas (row), también podemos grabar colecciones de datos en una tabla mediante un ciclo for, acercándonos así al objetivo de crear una tabla (base) de datos.

Para ello primero establecemos una hoja como hoja activa, esto es, la hoja sobre la que copiaremos los datos (sheet = hc_uno.active) y forzamos que ésta sea la nombrada como Sheet en el libro (sheet = hc_uno['Sheet'])

... después creamos nuestra colección de datos (en esta ocasión de forma directa)...

datos = [('id','Nombre', 'Edad'),
         (0,'José',35),
         (1,'Lucas',27),
         (2,'Mario',31),
         (3,'Antonio',28),
         (4,'Sonia',24)
    ]

... y después desarrollamos un ciclo for sobre el parámetro row 

for row in datos:
    sheet.append(row)

Documento. Aunque no sea gran cosa, te dejo acceso al script que contiene el código trabajado en esta entrada. Con el tiempo ampliaremos el código para darle forma y utilidad; de momento es más puro ejercicio para aprender a manejarnos con openpyxl.