En este tutorial te voy a explicar cómo crear un archivo excel en Python usando la librería openpyxl.
Muchas aplicaciones que trabajan con datos necesitan exportar dichos datos a diferentes formatos. Un formato muy común y extendido son las hojas de cálculo.
En Python existen diferentes librerías para crear archivos excel, siendo una de las más populares openpyxl, por su facilidad de uso y porque permite tanto leer como escribir hojas de cálculo. Si es tu caso, no te pierdas los pasos que te indico a continuación y descubre cómo crear un archivo excel usando la librería openpyxl.
Índice
Instalación de openpyxl
Al tratarse de una librería externa, lo primero que debes hacer para usar openpyxl
es instalarla.
Crea un nuevo directorio para tu proyecto, accede a él e inicializa un entorno virtual.
Una vez que actives el entorno virtual, ejecuta el siguiente comando desde un terminal para instalar openpyxl
:
$> pip install openpyxl
Crear archivo excel en python
Como ya sabrás, en terminología de hojas de cálculo, las hojas de cálculo se agrupan en libros. Un libro es la entidad superior de una hoja de cálculo (se suele corresponder con un archivo excel). A su vez, un libro está compuesto por una o más hojas. Un libro siempre está formado, al menos, por una hoja y la hoja en la que se está trabajando se denomina hoja activa.
Para comenzar a trabajar con openpyxl
, no hace falta guardar ningún archivo en el sistema de ficheros. Simplemente hay que crear un libro.
En el código siguiente te muestro cómo crear un libro en openpyxl
:
import openpyxl wb = openpyxl.Workbook()
La variable wb
es una instancia de un libro en blanco. El libro recién creado contiene una única hoja que está activa. Para acceder a ella lo puedes hacer a través del atributo active
.
Una de las propiedades principales de una hoja es su nombre ya que, como veremos en una sección posterior, nos permite acceder a ella directamente a través del mismo.
El siguiente ejemplo muestra cómo acceder al nombre de la hoja activa y cómo modificarlo:
>>> import openpyxl >>> wb = openpyxl.Workbook() >>> hoja = wb.active >>> print(f'Hoja activa: {hoja.title}') Hoja activa: Sheet >>> hoja.title = "Valores" >>> print(f'Hoja activa: {wb.active.title}') Hoja activa: Valores
Crear una hoja
Además de la hoja por defecto, con openpyxl
es posible crear más hojas en un libro utilizando el método create_sheet()
del workbook
del siguiente modo (continúa del ejemplo anterior):
# Añade la hoja 'Hoja' al final (por defecto) >>> hoja1 = wb.create_sheet("Hoja") # Añade la hoja 'Hoja' en la primera posición. Como el nombre # 'Hoja' ya existe, le añade el número 1 al final del nombre >>> hoja2 = wb.create_sheet("Hoja", 0) # Añade la hoja 'Otra hoja' en la posición 1 >>> wb.create_sheet(index=1, title="Otra hoja") # Muestra los nombres de las hojas >>> print(wb.sheetnames) ['Hoja1', 'Otra hoja', 'Valores', 'Hoja']
También es posible crear una copia de una hoja con el método copy_worksheet()
:
>>> origen = wb.active >>> nueva = wb.copy_worksheet(origen)
Acceder a una hoja
Como te decía en una sección anterior, los nombres de las hojas son una propiedad muy importante ya que nos permiten acceder a ellas directamente tratando el workbook
como un diccionario. Siguiendo con el ejemplo:
>>> hoja = wb.active # Es la hoja que está en el índice 0 >>> print(f'Hoja activa: {hoja.title}') Hoja activa: Hoja1 >>> hoja = wb['Otra hoja'] >>> wb.active = hoja >>> print(f'Hoja activa: {wb.active.title}') Hoja activa: Otra hoja
Por otro lado, tal y como hemos visto en la sección anterior, es posible obtener una lista con los nombres de todas las hojas accediendo a la propiedad sheetnames
del workbook
. También es posible iterar sobre todas las hojas:
>>> print(wb.sheetnames) ['Hoja1', 'Otra hoja', 'Valores', 'Hoja'] >>> for hoja in wb: ... print(hoja.title) Hoja1 Otra hoja Valores Hoja
Acceder a una celda
Hasta aquí hemos visto cómo crear un libro, las hojas y cómo acceder a ellas. Ahora vamos a lo importante, cómo acceder al valor de una celda y cómo guardar un dato.
Es posible acceder a una celda tratando a la hoja como un diccionario, de tal manera que se usa como clave el nombre de la celda. Este resulta de la combinación del nombre de la columna y el número de la fila.
A continuación te muestro cómo acceder a la celda de la columna A y la fila 1:
>>> wb = openpyxl.Workbook() >>> hoja = wb.active >>> a1 = hoja["A1"] >>> print(a1.value) None
También es posible acceder a una celda usando la notación fila, columna con el método cell()
del siguiente modo:
>>> b2 = hoja.cell(row=2, column=2) >>> print(b2.value)
❗️ IMPORTANTE: Cuando se crea un libro, este no contiene ninguna celda. Las celdas se van creando en memoria a medida que se va accediendo a ellas, aunque no contengan ningún valor.
Escribir valores en una celda
En la sección anterior habrás podido comprobar que al mostrar el contenido de una celda (print(a1.value)
) siempre devolvía None
. Esto se debe a que la celda no contiene ningún valor.
Para asignar un valor a una celda en concreto, se puede hacer de tres formas diferentes:
# 1.- Asignando el valor directamente a la celda >>> hoja["A1"] = 10 >>> a1 = hoja["A1"] >>> print(a1.value) 10 # 2.- Usando la notación fila, columna con el argumento value >>> b1 = hoja.cell(row=1, column=2, value=20) >>> print(b1.value) 20 # 3.- Actualizando la propiedad value de una celda >>> c1 = hoja.cell(row=1, column=3) >>> c1.value = 30 >>> print(c1.value) 30
Guardar una lista de valores
Asignar un valor a una celda puede estar bien para determinados casos. Sin embargo, en Python suele ocurrir que los datos están almacenados en listas o tuplas. Para estos casos, en los que se requiere exportar determinados datos, te voy a enseñar una manera más óptima de crear un fichero excel usando openpyxl.
Imagina que tienes un listado de productos con nombre, referencia, stock y precio como el siguiente:
productos = [ ('producto_1', 'a859', 1500, 9.95), ('producto_2', 'b125', 600, 4.95), ('producto_3', 'c764', 200, 19.95), ('producto_4', 'd399', 2000, 49.95) ]
¿Cómo podemos exportar estos datos a excel usando openpyxl? Lo más fácil es usar el método append()
de un objeto hoja.
Te lo muestro a continuación:
productos = [ ('producto_1', 'a859', 1500, 9.95), ('producto_2', 'b125', 600, 4.95), ('producto_3', 'c764', 200, 19.95), ('producto_4', 'd399', 2000, 49.95) ] wb = openpyxl.Workbook() hoja = wb.active # Crea la fila del encabezado con los títulos hoja.append(('Nombre', 'Referencia', 'Stock', 'Precio')) for producto in productos: # producto es una tupla con los valores de un producto hoja.append(producto)
Guardar un libro excel en Python
Termino este tutorial mostrándote cómo guardar un archivo excel en Python usando openpyxl.
Para guardar un archivo excel usando openpyxl, solo tienes que llamar al método save()
del workbook indicando el nombre del archivo. Esto guardará el libro con todas las hojas y los datos de cada una de ellas.
Si lo hacemos sobre el libro anterior, tendremos el siguiente resultado:
wb.save('productos.xlsx')
