certmundo.
es‑mx

6 min de lectura

¿Cómo leer y escribir archivos Excel con Python?

Puedes leer y escribir archivos Excel con Python usando las librerías openpyxl y pandas, sin necesidad de abrir Excel manualmente.

Instalación de las librerías

Antes de comenzar, instala las dos librerías necesarias. Ejecuta este comando en tu terminal:

pip install openpyxl pandas

openpyxl trabaja directamente con archivos .xlsx. pandas simplifica la lectura y escritura de tablas de datos.


Estructura de un archivo Excel en Python

Excel organiza la información en tres niveles:

Concepto Equivalente en Python (openpyxl)
Archivo .xlsx Workbook
Hoja (pestaña) Worksheet
Celda Cell

Con openpyxl, navegas estos tres niveles con código simple.


Cómo leer un archivo Excel con openpyxl

Sintaxis básica

import openpyxl

# Abrir el archivo
wb = openpyxl.load_workbook("ventas.xlsx")

# Seleccionar la hoja activa
hoja = wb.active

# Leer una celda específica
valor = hoja["B2"].value
print(valor)

Ejemplo 1: Leer el reporte de ventas de Liverpool

Imagina que tienes un archivo ventas_liverpool.xlsx con esta estructura:

A B C
Producto Unidades Precio
Televisor 12 8500
Lavadora 7 12000
Refrigerador 5 18500

Este código lee todas las filas e imprime el total de cada producto:

import openpyxl

wb = openpyxl.load_workbook("ventas_liverpool.xlsx")
hoja = wb.active

# Saltar la fila de encabezados (fila 1)
for fila in hoja.iter_rows(min_row=2, values_only=True):
    producto, unidades, precio = fila
    total = unidades * precio
    print(f"{producto}: ${total:,}")

Salida esperada:

Televisor: $102,000
Lavadora: $84,000
Refrigerador: $92,500

values_only=True extrae solo los valores, no los objetos de celda. min_row=2 omite el encabezado.


Cómo escribir un archivo Excel con openpyxl

Sintaxis básica

import openpyxl

# Crear un libro nuevo
wb = openpyxl.Workbook()
hoja = wb.active
hoja.title = "Reporte"

# Escribir en celdas
hoja["A1"] = "Producto"
hoja["B1"] = "Total"

# Guardar el archivo
wb.save("reporte.xlsx")

Ejemplo 2: Generar una nómina automática para FEMSA

Este script crea un archivo de nómina con el cálculo de IMSS ya incluido:

import openpyxl

empleados = [
    ("Carlos Mendoza", 18500),
    ("Laura Torres", 22000),
    ("Iván Reyes", 15000),
]

wb = openpyxl.Workbook()
hoja = wb.active
hoja.title = "Nomina Enero"

# Encabezados
hoja.append(["Empleado", "Salario Bruto", "Descuento IMSS (4%)", "Salario Neto"])

# Datos
for nombre, salario in empleados:
    descuento = round(salario * 0.04, 2)
    neto = salario - descuento
    hoja.append([nombre, salario, descuento, neto])

wb.save("nomina_femsa_enero.xlsx")
print("Nómina generada correctamente.")

El archivo resultante tiene cuatro columnas listas para revisar en Excel. No se necesita abrir Excel en ningún momento.


Cómo leer y escribir Excel con pandas

pandas es más rápido cuando trabajas con tablas grandes. Usa read_excel() para leer y to_excel() para escribir.

Sintaxis básica

import pandas as pd

# Leer
df = pd.read_excel("datos.xlsx", sheet_name="Hoja1")

# Escribir
df.to_excel("resultado.xlsx", index=False)

index=False evita que pandas agregue una columna extra con números de fila.

Ejemplo 3: Filtrar pedidos de Mercado Libre por monto

Tienes un archivo pedidos_meli.xlsx con miles de pedidos. Necesitas extraer solo los pedidos mayores a $5,000:

import pandas as pd

# Leer el archivo original
df = pd.read_excel("pedidos_meli.xlsx")

# Filtrar pedidos mayores a $5,000
df_filtrado = df[df["monto"] > 5000]

# Guardar el resultado en un nuevo archivo
df_filtrado.to_excel("pedidos_grandes.xlsx", index=False)

print(f"Se encontraron {len(df_filtrado)} pedidos mayores a $5,000.")

Este proceso que manualmente tomaría 20 minutos, Python lo hace en segundos.

Ejemplo 4: Agregar una columna calculada a un reporte de Bimbo

Tienes un reporte con columnas cajas_vendidas y precio_caja. Necesitas agregar la columna ingreso_total:

import pandas as pd

df = pd.read_excel("ventas_bimbo.xlsx")

# Crear nueva columna
df["ingreso_total"] = df["cajas_vendidas"] * df["precio_caja"]

# Calcular el total general
total = df["ingreso_total"].sum()
print(f"Ingreso total del periodo: ${total:,.0f}")

# Guardar con la nueva columna
df.to_excel("ventas_bimbo_actualizado.xlsx", index=False)

Salida esperada:

Ingreso total del periodo: $1,248,500

Trabajar con múltiples hojas

Algunos archivos Excel tienen varias pestañas. Con openpyxl puedes acceder a cualquier hoja por nombre:

import openpyxl

wb = openpyxl.load_workbook("reporte_anual.xlsx")

# Ver todos los nombres de hojas
print(wb.sheetnames)

# Acceder a una hoja específica
hoja_enero = wb["Enero"]
hoja_febrero = wb["Febrero"]

print(hoja_enero["A1"].value)

Con pandas también puedes especificar la hoja:

df_enero = pd.read_excel("reporte_anual.xlsx", sheet_name="Enero")
df_feb = pd.read_excel("reporte_anual.xlsx", sheet_name="Febrero")

Errores comunes

1. Olvidar values_only=True en openpyxl

Sin este parámetro, iter_rows() devuelve objetos Cell, no los valores directamente.

# ❌ Incorrecto
for fila in hoja.iter_rows(min_row=2):
    print(fila)  # Muestra objetos Cell, no datos

# ✅ Correcto
for fila in hoja.iter_rows(min_row=2, values_only=True):
    print(fila)  # Muestra los valores reales

2. Usar to_excel() sin engine="openpyxl"

En algunas versiones de pandas, necesitas especificar el motor explícitamente para archivos .xlsx:

# Si obtienes un error de motor, agrega esto:
df.to_excel("resultado.xlsx", index=False, engine="openpyxl")

3. No cerrar el archivo antes de volver a abrirlo

Si abres el archivo en Excel y luego intentas guardarlo con Python, obtendrás un error de permisos. Siempre cierra el archivo en Excel antes de ejecutar tu script.

4. Mezclar índices de fila y columna

openpyxl usa índices desde 1, no desde 0. Esto confunde a quienes vienen de listas de Python.

# ❌ Incorrecto (fila 0 no existe en openpyxl)
hoja.cell(row=0, column=1).value

# ✅ Correcto
hoja.cell(row=1, column=1).value  # Primera celda: A1

Cuándo usar openpyxl vs pandas

Situación Usa
Leer tablas grandes (miles de filas) pandas
Filtrar y transformar datos pandas
Dar formato a celdas (colores, fuentes) openpyxl
Trabajar con fórmulas de Excel openpyxl
Crear reportes simples Cualquiera
Automatizar nóminas o reportes contables openpyxl o ambos

Puedes combinar ambas: usa pandas para procesar los datos y openpyxl para aplicar formato al archivo final.


Puntos clave

  • openpyxl es ideal para leer y escribir celdas individuales, aplicar formato y trabajar con múltiples hojas.
  • pandas es más rápido para tablas grandes: filtra, transforma y calcula columnas en pocas líneas.
  • Usa values_only=True en iter_rows() para obtener valores directamente, no objetos Cell.
  • Siempre cierra el archivo en Excel antes de ejecutar tu script, para evitar errores de permisos.
  • Puedes combinar pandas y openpyxl en el mismo proyecto: uno procesa, el otro da formato.

Puntos clave

  • Usa `openpyxl` para acceder a celdas individuales, aplicar formato y trabajar con hojas específicas de un archivo `.xlsx`.
  • Usa `pandas` con `read_excel()` y `to_excel()` para procesar tablas grandes: filtrar filas, agregar columnas calculadas y exportar resultados en segundos.
  • Siempre usa `values_only=True` en `iter_rows()` de openpyxl para obtener los valores de las celdas directamente, no objetos internos.
  • Los índices en `openpyxl` comienzan en **1**, no en **0**. La primera celda es `row=1, column=1`, equivalente a `A1`.
  • Cierra el archivo en Excel antes de ejecutar tu script. Si el archivo está abierto, Python no puede guardarlo y lanzará un error de permisos.

Comparte esta lección:

¿Cómo leer y escribir archivos Excel con Python? | Automatización con Python | Certmundo