Formato XLSX: Dentro de la hoja de cálculo Open XML de Microsoft Excel
XLSX (Excel Open XML Workbook) es el formato de hoja de cálculo de Microsoft introducido con Office 2007, reemplazando al formato binario XLS. Como DOCX, es un archivo ZIP que contiene ficheros XML conformes al estándar Office Open XML (OOXML).
Estructura interna de XLSX
libro.xlsx/
├── [Content_Types].xml
├── _rels/.rels
├── xl/
│ ├── workbook.xml — estructura del libro (lista de hojas, rangos con nombre)
│ ├── styles.xml — formatos de celda, formatos numéricos, fuentes, rellenos, bordes
│ ├── sharedStrings.xml — tabla de búsqueda de cadenas
│ ├── theme/theme1.xml — tema de color
│ ├── worksheets/
│ │ ├── sheet1.xml — datos de Hoja 1
│ │ └── sheet2.xml — datos de Hoja 2
│ ├── charts/chart1.xml — definiciones de gráficos
│ └── calcChain.xml — cadena de dependencias de cálculo
└── docProps/
├── app.xml — metadatos de aplicación
└── core.xml — propiedades del libro
La optimización sharedStrings.xml
El concepto estructural más importante en XLSX: todos los valores de cadena se almacenan una vez en una tabla de cadenas compartidas, no en línea en cada celda. Esto reduce drásticamente el tamaño del fichero cuando la misma cadena aparece en muchas celdas.
En xl/sharedStrings.xml:
<sst count="4" uniqueCount="3">
<si><t>Nombre del producto</t></si> <!-- índice 0 -->
<si><t>Cantidad</t></si> <!-- índice 1 -->
<si><t>Precio</t></si> <!-- índice 2 -->
</sst>
En xl/worksheets/sheet1.xml, una celda con valor de cadena referencia el índice:
<c r="A1" t="s"> <!-- t="s" significa tipo="cadena compartida" -->
<v>0</v> <!-- índice 0 = "Nombre del producto" -->
</c>
Las celdas de fecha almacenan fechas como números de serie (días desde el 0 de enero de 1900 — el famoso bug de época de Excel donde 1900 se trata incorrectamente como año bisiesto).
Trabajo programático con XLSX
Python — openpyxl
from openpyxl import Workbook, load_workbook
from openpyxl.styles import Font, PatternFill, Alignment
# Crear nuevo libro
wb = Workbook()
ws = wb.active
ws.title = "Datos de ventas"
# Escribir cabeceras con formato
cabeceras = ["Producto", "Cant.", "Precio", "Total"]
for col, cabecera in enumerate(cabeceras, 1):
celda = ws.cell(row=1, column=col, value=cabecera)
celda.font = Font(bold=True, color="FFFFFF")
celda.fill = PatternFill("solid", fgColor="4472C4")
celda.alignment = Alignment(horizontal="center")
# Escribir datos con fórmula
datos = [("Widget A", 100, 9.99), ("Widget B", 250, 4.99)]
for fila, (producto, cant, precio) in enumerate(datos, 2):
ws.cell(row=fila, column=1, value=producto)
ws.cell(row=fila, column=2, value=cant)
ws.cell(row=fila, column=3, value=precio)
ws.cell(row=fila, column=4, value=f"=B{fila}*C{fila}")
wb.save("salida.xlsx")
# Leer libro existente
wb2 = load_workbook("datos.xlsx", data_only=True)
ws2 = wb2.active
for fila in ws2.iter_rows(min_row=2, values_only=True):
print(fila)
pandas (procesamiento de datos)
import pandas as pd
# Leer XLSX
df = pd.read_excel("datos.xlsx", sheet_name="Hoja1", header=0)
# Procesar datos
resumen = df.groupby("Categoría")["Ingresos"].sum().reset_index()
# Escribir múltiples hojas
with pd.ExcelWriter("salida.xlsx", engine="openpyxl") as writer:
df.to_excel(writer, sheet_name="Datos brutos", index=False)
resumen.to_excel(writer, sheet_name="Resumen", index=False)
XLSX vs. XLS vs. CSV vs. ODS
| Formato | Filas máx. | Cols máx. | Fórmulas | Múltiples hojas | Abierto |
|---|---|---|---|---|---|
| XLSX | 1.048.576 | 16.384 | ✅ | ✅ | ✅ |
| XLS (legado) | 65.536 | 256 | ✅ | ✅ | Parcial |
| CSV | Ilimitado* | Ilimitado* | ❌ | ❌ | ✅ |
| ODS | 1.048.576 | 1.024 | ✅ | ✅ | ✅ |
Optimización del tamaño de XLSX
| Estrategia | Impacto |
|---|---|
| Eliminar estilos no usados | Grande (styles.xml puede inflarse) |
| Limpiar filas/columnas vacías | Medio |
| Eliminar caché de tabla dinámica | Grande (puede doblar el tamaño) |
| Guardar como xlsb (binario) | Muy grande (50-70% más pequeño) |
Resumen
La arquitectura ZIP+XML de XLSX lo convierte en el formato de hoja de cálculo más accesible para procesamiento programático. La tabla de cadenas compartidas elimina el almacenamiento redundante de cadenas, las fórmulas almacenan en caché sus últimos valores calculados para lectura sin conexión, y el sistema de estilos permite formato enriquecido sin redundancia por celda. Bibliotecas como openpyxl, pandas y Apache POI hacen que la generación y análisis de XLSX sea sencillo en cada lenguaje de programación principal. Para intercambio puro de datos, CSV es más simple. Para informes con formato enriquecido, tablas dinámicas y gráficos, XLSX es el estándar.
Conversiones relacionadas
Conversiones de documento que siguen este tema: