Python y Excel 365: el operador @ en fórmulas exportadas con openpyxl (solución con xlwings)

Problema frecuente para quienes automatizan Excel con Python: al exportar fórmulas usando openpyxl, Excel 365 añade el operador @ delante de las funciones (por ejemplo, @SI en vez de SI). Esto ocurre porque openpyxl no tiene soporte nativo para matrices dinámicas, y Excel 365 interpreta las fórmulas en modo clásico aplicando la intersección implícita (el operador @ fuerza que solo se muestre el primer resultado).

La raíz técnica es la diferencia entre Formula (modo clásico, que openpyxl usa) y Formula2 (modo moderno con matrices dinámicas y desbordamiento natural). A partir de Excel 365, las fórmulas que podrían desbordar se limitan con @ si se escriben en modo clásico.

La comunidad propuso usar xlwings, que permite acceder a la API COM de Excel y escribir fórmulas con Formula2. Se compartió un script Python completo y bien documentado que detecta si el archivo ya está abierto en Excel (para no abrir una instancia duplicada), escribe fórmulas usando Formula2 con fallback a Formula clásico, y gestiona correctamente el ciclo de vida de la instancia Excel:

``python
Con xlwings, usar Formula2 para modo moderno (matrices dinámicas)
try:
rng.api.Formula2 = formula # Modo moderno
except Exception:
rng.api.Formula = formula # Fallback al modo clásico
`

El trade-off es rendimiento: openpyxl procesa en ~30 segundos (trabaja directamente con el XML del xlsx), mientras que xlwings tarda ~4-5 minutos (usa COM, necesita una instancia de Excel corriendo). Pero la ventaja de xlwings es que las fórmulas matriciales y dinámicas funcionan correctamente sin el operador @.

Funciones y conceptos clave: Formula2 vs Formula (API COM), operador de intersección implícita (@), matrices dinámicas y desbordamiento (spill), SEQUENCE, SUM, TAKE con referencias desbordadas (F1#`).

Más contenido de Excel en InflueXcel