Creación, edición y análisis de XLSX
| Tarea | Enfoque |
|---|---|
| Crear o editar con fórmulas/formato | openpyxl — ver advertencias abajo |
| Datos masivos de entrada o salida | pandas (read_excel, to_excel) |
| Vista rápida de una hoja | markitdown archivo.xlsx — ## NombreHoja por hoja; también lee .xlsm. Sin coordenadas de celda, así que no planees ediciones a partir de esto |
| Leer un modelo (fórmulas y valores) | dos pasadas de load_workbook — ver advertencias |
openpyxl,pandasymarkitdownestán preinstalados — no ejecutesuv pip installprimero; escribe el script e importa directamente. Solo si una importación falla (o falta el comandomarkitdown):uv pip installel paquete faltante.
Las rutas de los scripts abajo son relativas al directorio de este skill.
Requisitos para cada salida
- Fuente profesional (Arial, Times New Roman) en todo el documento, a menos que el usuario indique lo contrario.
- Cero errores de fórmula. Nunca entregues un archivo cuando
recalc.pyreporteerrors_found. Si crees que un error es anterior a tu intervención, demuéstralo: carga el archivo original condata_only=Truey revisa esa celda. Un error que introdujiste se ve exactamente igual que uno heredado. - Usa fórmulas, nunca resultados calculados directamente. Escribe
sheet['B10'] = '=SUMA(B2:B9)', no el total calculado en Python. La hoja debe recalcularse cuando sus entradas cambien. - Sigue las especificaciones del usuario literalmente. Nombres de pestañas exactos, encabezados de columna exactos y la fórmula que ellos indicaron. Un rediseño que calcula algo diferente falla, por más elegante que sea.
- Documenta cada suposición y número fijo donde el lector pueda verlo — un comentario de celda, o una celda adyacente al final de una tabla. Cita una fuente real cuando exista (
Fuente: 10-K de la empresa, FY2024, Página 45, Nota de Ingresos, [URL de SEC EDGAR]); cuando el número provino del usuario, indícalo claramente. - Un libro de trabajo que crees para que alguien lo llene necesita una breve leyenda que nombre qué celdas editar, y una fila de ejemplo con valores realistas que muestren el formato esperado. Nunca agregues esa fila a un archivo que se te pidió editar.
- Editar un archivo existente: sigue sus convenciones exactamente. Estas anulan cualquier directriz aquí. Encuentra primero sus celdas de entrada designadas — un color de fuente, relleno o sombreado distinto las marca — escribe solo allí, y deja intacta cada fórmula existente.
Recalcular (obligatorio cuando el archivo contiene fórmulas)
openpyxl escribe fórmulas como cadenas de texto sin valores cacheados. Hasta que recalculas, cada celda de fórmula se lee como None para todo lo que lea valores cacheados — pandas, load_workbook(data_only=True), y la mayoría de los visores.
python scripts/recalc.py archivo_salida.xlsx [segundos_tiempo_espera] # por defecto 30
LibreOffice calcula cada fórmula, el archivo es sobrescrito en el mismo lugar, y obtienes JSON: status (success | errors_found), total_formulas, total_errors, y un error_summary que nombra hasta 100 celdas por tipo de error (locations_truncated dice cuántas se omitieron — confía en total_errors, no en la longitud de la lista). Corrige lo que nombra y ejecútalo de nuevo. JSON con una clave error en lugar de status significa que no se recalculó nada, y solo ese caso termina con código distinto de cero — errors_found termina con 0, así que nunca trates una salida limpia como un libro de trabajo limpio.
Un recálculo verde prueba que tus fórmulas se evalúan, no que sean correctas. Un rango con error de uno o una referencia a la fila equivocada produce un archivo limpio, sin errores, con números incorrectos. Escribe 2–3 fórmulas primero y verifica que extraen los valores que esperas, antes de construir una cuadrícula completa.
Un libro de trabajo que se vincula a otro archivo pierde esos vínculos si lo vuelves a guardar con openpyxl y luego recalculas. Tal fórmula lee ='[1]Análisis de Rendimientos'!$B$2 — el [1] es un índice en la lista de referencias externas del libro, nombrando un archivo separado en el disco, no una hoja. Ese archivo rara vez está presente aquí, por lo que el valor cacheado de la celda es lo único que mantiene sus datos. openpyxl elimina ese valor al guardar; LibreOffice entonces tiene que resolver la referencia realmente, falla, escribe #NAME?, y elimina cada vínculo. recalc.py se niega a ejecutarse en ese estado — copia los valores de esas celdas del original antes de guardar sobre él (--force anula y acepta la pérdida).
Elegir fórmulas que sobrevivan la verificación
LibreOffice implementa menos funciones que Excel, y una que no puede evaluar se convierte en un literal #NAME? incrustado en el archivo que entregas.
- Prefiere funciones de la era de Excel 2007 —
SUMAR.SI.CONJUNTO,INDICE,COINCIDIR,SI.ERROR,SUMAPRODUCTO— que no necesitan prefijo. - Seis funciones posteriores a 2007 funcionan, pero solo con un prefijo
_xlfn., porque openpyxl escribe tu fórmula textualmente en el XML y Excel almacena los nombres posteriores a 2007 con prefijo (su interfaz de usuario oculta el prefijo):_xlfn.TEXTO.UNIR,_xlfn.CONCATENAR,_xlfn.SI.CONJUNTO,_xlfn.CAMBIAR,_xlfn.MAX.SI.CONJUNTO,_xlfn.MIN.SI.CONJUNTO. Escritos sin prefijo, cada uno produce#NAME?. - Nunca uses
BUSCARX,COINCIDIRX,ORDENAR,FILTRAR,UNICOS, oSECUENCIA. El motor en tiempo de ejecución de LibreOffice no puede evaluarlas bajo ningún prefijo. Las versiones más nuevas sí las evalúan, pero son funciones de matriz dinámica y un archivo escrito por openpyxl no tiene metadatos de expansión, por lo que solo la celda superior izquierda del rango obtiene un valor — yrecalc.pyreportatotal_errors: 0sobre el resultado truncado. UsaINDICE/COINCIDIRpara búsquedas, y ordena, filtra y elimina duplicados en Python antes de escribir las celdas. - Una fórmula que LibreOffice no pudo analizar se escribe de vuelta en minúsculas — una pista rápida junto a un
#NAME?.
Advertencias de openpyxl
- Leer un modelo requiere dos cargas.
data_only=Trueproduce valores cacheados con las fórmulas eliminadas; el valor predeterminado produce cadenas de fórmula sin valores. Una sola pasada no puede darte ambos. data_only=Truees destructivo si guardas. Ese libro de trabajo no tiene fórmulas restantes, por lo que guardar reemplaza cada una con un literal — permanentemente.data_only=Trueen un archivo que openpyxl acaba de escribir devuelveNoneen todas partes — ejecutarecalc.pyprimero. (Una fórmula cuyo resultado es""también se lee comoNone).- Celdas combinadas: escribe solo el ancla superior izquierda. Cada otra celda en el rango es una
MergedCellcuyo.valuees de solo lectura. .xlsmpierde sus macros a menos que paseskeep_vba=Trueaload_workbook.- Un nombre de hoja que contiene un espacio debe ir entre comillas en una referencia entre hojas:
='Supuestos de Entrada'!$B$5. Sin comillas, se evalúa como#VALUE!.
Modelos financieros
A menos que el usuario indique lo contrario, o el archivo existente ya haga algo diferente.
Color: texto azul (0,0,255) para entradas fijas y palancas de escenario · negro para fórmulas · verde (0,128,0) para enlaces a otra hoja · rojo (255,0,0) para enlaces a otro archivo · relleno amarillo (255,255,0) para supuestos clave y celdas que el usuario debe llenar.
Números: moneda $#,##0, con la unidad nombrada en el encabezado (Ingresos ($mm)) · los ceros se muestran como -, incluso en porcentajes ($#,##0;($#,##0);-) · negativos entre paréntesis · porcentajes 0.0%, almacenados como fracciones (0.15 muestra 15.0%; almacenar 15 muestra 1500.0%) · múltiplos de valoración 0.0x · años como texto ("2024", nunca 2,024).
Estructura: cada supuesto en su propia celda etiquetada, referenciada por las fórmulas que lo usan (=B5*(1+$B$6), nunca =B5*1.05) · fórmulas consistentes en cada período de proyección, ya que una celda editada aislada en medio de una fila es el error silencioso más común · protege denominadores que puedan ser cero.
Dependencias
openpyxl, pandas, markitdown (pip, preinstalados — instalar solo si una importación falla o falta el comando) · LibreOffice (soffice, auto-configurado para entornos tipo caja de arena mediante scripts/office/soffice.py)
Este skill es creado y mantenido por Anthropic. Incluido aquí sin modificaciones, excepto metadatos de frontmatter; consulte LICENSE.txt para los términos.