Saltar al contenido

Indice / Practicas / EJ-7.3

EJ-7.3 · Exportar a Excel con tres hojas

Practica de: 7.3 Excel con openpyxlDificultad: B

Entregar el resultado de EJ-5.2 como una planilla de tres hojas, con el encabezado en negrita y fijo. Y de paso, una pregunta que no apareció hasta ahora: ¿cómo se verifica algo que no es un CSV?

Qué hay que hacer

Producir clientes.xlsx con tres hojas:

Las tres con el encabezado en negrita y los paneles congelados en A2, para que al scrollear se siga viendo qué columna es cada una.

ELI5Explicado facil

Los CSV son para las máquinas; esto es para una persona. Alguien va a abrir el archivo, mirar la hoja de rechazados, scrollear, y necesitar saber en qué columna está mirando.

Por eso el encabezado va en negrita y fijo. No es decoración: es lo que hace que la planilla se pueda usar.

Archivos

El entregable y lo que se verifica

Un .xlsx es un zip con metadatos que cambian entre corridas, así que no se puede comparar archivo contra archivo. Lo que se verifica es un manifiesto: una tabla de tres filas que describe el libro.

Y la parte importante: el manifiesto se arma leyendo el .xlsx que acabás de escribir, no de lo que creés haber escrito. Escribirlo a mano lo convierte en una repetición de tu intención, no en una comprobación.

Cómo saber si te salió

python comparar.py mi_manifiesto.csv clientes_manifiesto.csv

Si el manifiesto coincide, tu libro tiene las tres hojas en el orden correcto, con las filas y columnas correctas, el encabezado en negrita y los paneles congelados.

Antes de arrancar, mirá los datos

objetivos/ej-5-02/clientes_limpios.csv (entrada) · 87 filas, se muestran 5
idnombrecorreoedadciudadfecha_altaedad_imputada
C0001José Pazjose.paz@example.com62Salta2025-02-200
C0002Lucía Peñalucia.pena@example.com48Salta2025-01-050
C0003Santiago Herrerasantiago.herrera@example.com40Salta2024-05-120
C0004José Rodríguezjose.rodriguez@example.com67Paraná2024-08-110
C0005Walter Gutiérrezwalter.gutierrez@example.com34Rosario2026-01-010

El contrato de salida

clientes_manifiesto.csv · 3 filas

ColumnaTipoQue lleva
hojatextoEl nombre de la hoja, en el orden en que estan en el libro
filasenteroFilas de datos de esa hoja, sin contar el encabezado
columnasenteroCuantas columnas tiene
nombres_columnastextoLos nombres unidos con '; ', en el orden de la hoja
encabezado_negritaentero1 si TODAS las celdas de la fila 1 estan en negrita
paneles_congeladostextoLa celda desde la que se congelan los paneles: A2

Orden de las filas: el orden de las hojas en el libro: limpios, rechazados, resumen. NO se ordena alfabeticamente. Indice: no se escribe: to_csv(index=False)

Que hacer con cada defecto

DefectoDondeAccionAdonde va
los datos de entrada ya vienen limpiosson las salidas de EJ-5.2no no se toca ni un valor: las hojas limpios y rechazados son los dos CSV tal cualclientes.xlsx
empates en la cantidad por motivo en la hoja resumenno ocurre con estos datos, pero la regla va igualordenar ordenar por cantidad DESC y, si empatan, por motivo ASCclientes.xlsx, hoja resumen
Orden de comprobacion

Una fila puede tener mas de un problema. Se informa solo el primero de esta lista:

  1. leer los dos CSV de entrada
  2. armar la hoja resumen agrupando los rechazos por motivo
  3. escribir las tres hojas con un unico ExcelWriter, dentro de un with
  4. abrir el archivo con load_workbook y aplicar negrita y freeze_panes
  5. volver a LEER el archivo para armar el manifiesto

El manifiesto se arma leyendo el archivo escrito, nunca de lo que uno cree haber escrito. Si se arma a mano deja de ser una comprobacion y pasa a ser una repeticion de la intencion. Y el estilo va DESPUES de escribir los datos: pandas no sabe poner negrita, y openpyxl necesita el archivo ya creado.

Conteos clave

Si estos numeros no te dan, algo se desvio antes de que llegues a comparar los archivos.

hojas del libro3
filas en limpios87
filas en rechazados33
filas en resumen4
clientes_manifiesto.csv3
por motivo

Invariantes

Comprobaciones que tu resultado tiene que cumplir. Corrilas vos mismo antes de comparar los archivos:

len(manifiesto) == 3
list(manifiesto['hoja']) == ['limpios', 'rechazados', 'resumen']
manifiesto.loc[0, 'filas'] == 87
manifiesto.loc[1, 'filas'] == 33
manifiesto.loc[2, 'filas'] == 4
manifiesto['encabezado_negrita'].eq(1).all()
manifiesto['paneles_congelados'].eq('A2').all()
manifiesto['filas'].sum() == 124
PISTASSi te trabas, abri esto
  • ExcelWriter siempre con with: el .xlsx se termina de armar al cerrarlo, y sin cerrar no abre.
  • pandas escribe los datos y openpyxl los viste. Son dos pasos y en ese orden.
  • El manifiesto se arma leyendo el .xlsx que acabas de escribir. Si lo escribis a mano no estas comprobando nada.
  • El orden de las hojas del manifiesto es el del libro, no el alfabetico: 'resumen' va ultima aunque empiece con r.

Así tiene que quedar

clientes_manifiesto.csv (objetivo) · 3 filas, se muestran 3
hojafilascolumnasnombres_columnasencabezado_negritapaneles_congelados
limpios877id; nombre; correo; edad; ciudad; fecha_alta; edad_imputada1A2
rechazados334id_origen; columna; valor_original; motivo1A2
resumen42motivo; cantidad1A2
Dos pasos, en este orden

pandas escribe los datos con un único ExcelWriter dentro de un with. openpyxl los viste después, abriendo el archivo ya creado con load_workbook.

No se puede al revés ni junto: pandas no sabe poner negrita, y openpyxl necesita que el archivo exista.

El orden de las hojas no es alfabético

El manifiesto lleva las hojas en el orden en que están en el libro: limpios, rechazados, resumen. Ordenarlo alfabéticamente pondría resumen última igual, por casualidad - y esa clase de casualidad es la que hace que un error aparezca recién con otros datos.