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
openpyxles ideal para leer y escribir celdas individuales, aplicar formato y trabajar con múltiples hojas.pandases más rápido para tablas grandes: filtra, transforma y calcula columnas en pocas líneas.- Usa
values_only=Trueeniter_rows()para obtener valores directamente, no objetosCell. - Siempre cierra el archivo en Excel antes de ejecutar tu script, para evitar errores de permisos.
- Puedes combinar
pandasyopenpyxlen el mismo proyecto: uno procesa, el otro da formato.