Crear archivo excel en Python con openpyxl

Crear archivo excel en python con openpyxl

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')
Crear archivo excel en python con openpyxl

¿Quieres ser expert@ en Python? Recibe trucos Python y las últimas novedades del blog

¡Eyyy! Esto también te puede interesar 👇

* Te informo de que los datos de carácter personal que proporciones al comentar serán tratados por Juan José Lozano Gómez como responsable de esta web. La Finalidad es moderar los comentarios. La Legitimación es gracias a tu consentimiento. Destinatarios: tus datos se encuentran alojados en Disqus (disqus.com), mi sistema de comentarios, que está acogido al acuerdo de seguridad EU-US Privacy. Podrás ejercer Tus Derechos de Acceso, Rectificación, Limitación o Suprimir tus datos enviando un email a juanjo@j2logo.com. Encontrarás más información en la POLÍTICA DE PRIVACIDAD.

Sobre j2logo

j2logo profile

Quiero ayudarte a que seas mejor programador/a, pero no uno cualquiera, sino uno de los top.

¿Quieres ser expert@ en Python? 🐍

❤️ He ayudado a miles de programadores/as como tú a ser mejores Pythonistas

📩 Recibe de vez en cuando trucos y scripts Python y las últimas novedades del blog

* Al enviar el formulario confirmas que aceptas la POLITICA DE PRIVACIDAD

¿Quieres ser expert@ en PYTHON?

j2logo-pythonistas

❤️ He ayudado a miles de programadores/as como tú

📩 Recibe trucos, scripts y las novedades del blog

¿Quieres dominar Python?

Python, Guía para ser un Pythonista

El curso con el que aprender el lenguaje desde cero. Con mi soporte y ayuda.

OFERTA BLACK FRIDAY

35% de descuento