Indice / Practicas / EJ-7.3
EJ-7.3 · Exportar a Excel con tres hojas
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:
limpios- los 87 clientes utilizables.rechazados- los 33 descartados con su motivo.resumen- una fila por motivo, con cuántos hubo.
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
- Entrada ·
objetivos/ej-5-02/clientes_limpios.csv - Entrada ·
objetivos/ej-5-02/clientes_rechazados.csv - Objetivo ·
clientes_manifiesto.csv - Herramienta ·
comparar.py
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
| id | nombre | correo | edad | ciudad | fecha_alta | edad_imputada |
|---|---|---|---|---|---|---|
| C0001 | José Paz | jose.paz@example.com | 62 | Salta | 2025-02-20 | 0 |
| C0002 | Lucía Peña | lucia.pena@example.com | 48 | Salta | 2025-01-05 | 0 |
| C0003 | Santiago Herrera | santiago.herrera@example.com | 40 | Salta | 2024-05-12 | 0 |
| C0004 | José Rodríguez | jose.rodriguez@example.com | 67 | Paraná | 2024-08-11 | 0 |
| C0005 | Walter Gutiérrez | walter.gutierrez@example.com | 34 | Rosario | 2026-01-01 | 0 |
El contrato de salida
clientes_manifiesto.csv · 3 filas
| Columna | Tipo | Que lleva |
|---|---|---|
hoja | texto | El nombre de la hoja, en el orden en que estan en el libro |
filas | entero | Filas de datos de esa hoja, sin contar el encabezado |
columnas | entero | Cuantas columnas tiene |
nombres_columnas | texto | Los nombres unidos con '; ', en el orden de la hoja |
encabezado_negrita | entero | 1 si TODAS las celdas de la fila 1 estan en negrita |
paneles_congelados | texto | La celda desde la que se congelan los paneles: A2 |
Que hacer con cada defecto
| Defecto | Donde | Accion | Adonde va |
|---|---|---|---|
| los datos de entrada ya vienen limpios | son las salidas de EJ-5.2 | no no se toca ni un valor: las hojas limpios y rechazados son los dos CSV tal cual | clientes.xlsx |
| empates en la cantidad por motivo en la hoja resumen | no ocurre con estos datos, pero la regla va igual | ordenar ordenar por cantidad DESC y, si empatan, por motivo ASC | clientes.xlsx, hoja resumen |
Una fila puede tener mas de un problema. Se informa solo el primero de esta lista:
- leer los dos CSV de entrada
- armar la hoja resumen agrupando los rechazos por motivo
- escribir las tres hojas con un unico ExcelWriter, dentro de un with
- abrir el archivo con load_workbook y aplicar negrita y freeze_panes
- 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
| hojas del libro | 3 |
|---|---|
| filas en limpios | 87 |
| filas en rechazados | 33 |
| filas en resumen | 4 |
| clientes_manifiesto.csv | 3 |
| 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
| hoja | filas | columnas | nombres_columnas | encabezado_negrita | paneles_congelados |
|---|---|---|---|---|---|
| limpios | 87 | 7 | id; nombre; correo; edad; ciudad; fecha_alta; edad_imputada | 1 | A2 |
| rechazados | 33 | 4 | id_origen; columna; valor_original; motivo | 1 | A2 |
| resumen | 4 | 2 | motivo; cantidad | 1 | A2 |
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 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.