DOCX: Word Open XML — La Anatomía Técnica del Formato de Documento Más Común del Mundo
DOCX es el formato de fichero utilizado por Microsoft Word desde 2007 y actualmente el estándar de facto para documentos editables en todo el mundo. A pesar de su ubicuidad, la mayoría de las personas tratan DOCX como una caja negra. Entender su estructura interna — archivo ZIP, componentes XML, modelo de relaciones — desbloquea potentes capacidades de automatización.
¿Qué Es DOCX?
DOCX es una implementación de OOXML (Office Open XML), estandarizado como ISO/IEC 29500 y ECMA-376. Se introdujo en Microsoft Office 2007 como reemplazo del formato binario .doc. A pesar del nombre "XML", DOCX no es un único fichero XML — es un archivo ZIP que contiene una jerarquía estructurada de ficheros XML, recursos binarios y ficheros de relaciones.
Estructura del Fichero DOCX: El Diseño ZIP
Renombra cualquier fichero .docx a .zip, extráelo y encuentras:
documento.docx (archivo ZIP)
├── [Content_Types].xml ← Registro de todas las partes y sus tipos MIME
├── _rels/
│ └── .rels ← Relaciones raíz (apunta a word/document.xml)
├── word/
│ ├── document.xml ← Cuerpo principal: párrafos, tablas, imágenes
│ ├── styles.xml ← Definiciones de estilos
│ ├── settings.xml ← Configuración del documento
│ ├── numbering.xml ← Definiciones de listas/numeración
│ ├── fontTable.xml ← Declaraciones de fuentes
│ ├── comments.xml ← Contenido de comentarios
│ ├── media/
│ │ ├── imagen1.png ← Imágenes incrustadas
│ │ └── imagen2.jpg
│ └── _rels/
│ └── document.xml.rels ← Relaciones para document.xml
└── docProps/
├── app.xml ← Metadatos de aplicación
└── core.xml ← Metadatos básicos (autor, creado, modificado, título)
document.xml: El Cuerpo del Documento
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:body>
<!-- Párrafo -->
<w:p>
<w:pPr>
<w:pStyle w:val="Heading1"/>
<w:jc w:val="center"/>
<w:spacing w:before="240" w:after="120"/>
</w:pPr>
<!-- Ejecución (texto contiguo con el mismo formato) -->
<w:r>
<w:rPr>
<w:b/>
<w:i/>
<w:sz w:val="48"/>
<w:color w:val="1F3864"/>
</w:rPr>
<w:t>Este es un encabezado en negrita cursiva</w:t>
</w:r>
</w:p>
<!-- Tabla -->
<w:tbl>
<w:tr>
<w:tc>
<w:p><w:r><w:t>Contenido de celda</w:t></w:r></w:p>
</w:tc>
</w:tr>
</w:tbl>
</w:body>
</w:document>
Unidades clave: OOXML usa twips (vigésima parte de un punto, 1/1440 de pulgada) para la mayoría de las medidas. Los tamaños de fuente usan medios puntos (24pt = <w:sz w:val="48"/>).
Python: Lectura y Escritura de DOCX con python-docx
from docx import Document
from docx.shared import Inches, Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
# ── Lectura de un DOCX ─────────────────────────
doc = Document('entrada.docx')
for para in doc.paragraphs:
if para.style.name.startswith('Heading'):
print(f"[{para.style.name}] {para.text}")
elif para.text.strip():
print(f" {para.text[:80]}")
# Leer tablas
for i, tabla in enumerate(doc.tables):
print(f"\nTabla {i+1}: {len(tabla.rows)} filas × {len(tabla.columns)} cols")
for fila in tabla.rows:
print(' |', ' | '.join(celda.text for celda in fila.cells), '|')
# ── Creación de un DOCX ─────────────────────────
doc = Document()
section = doc.sections[0]
section.top_margin = Inches(1)
section.left_margin = Inches(1.25)
titulo = doc.add_heading('Informe de Proyecto — T1 2024', level=0)
titulo.alignment = WD_ALIGN_PARAGRAPH.CENTER
para = doc.add_paragraph()
run = para.add_run('Hallazgo clave: ')
run.bold = True
run.font.color.rgb = RGBColor(0x1F, 0x38, 0x64)
run = para.add_run('los ingresos aumentaron un ')
run = para.add_run('23,4%')
run.bold = True
run.font.color.rgb = RGBColor(0, 128, 0)
run = para.add_run(' interanual.')
tabla = doc.add_table(rows=1, cols=3)
tabla.style = 'Table Grid'
celdas_cabecera = tabla.rows[0].cells
for i, cabecera in enumerate(['Trimestre', 'Ingresos', 'Crecimiento']):
celdas_cabecera[i].text = cabecera
celdas_cabecera[i].paragraphs[0].runs[0].bold = True
datos = [('T1 2024', '4,2M€', '+23,4%'), ('T4 2023', '3,4M€', '+18,1%')]
for datos_fila in datos:
fila = tabla.add_row()
for i, valor in enumerate(datos_fila):
fila.cells[i].text = valor
doc.save('salida.docx')
Conversión de DOCX
# DOCX a PDF usando LibreOffice (sin cabecera gráfica)
libreoffice --headless --convert-to pdf entrada.docx
# DOCX a Markdown usando Pandoc
pandoc entrada.docx -t markdown -o salida.md
# DOCX a HTML (preservando imágenes)
pandoc entrada.docx -t html --extract-media=./imagenes -o salida.html
# DOCX a EPUB
pandoc entrada.docx -o salida.epub
# Markdown a DOCX con plantilla
pandoc README.md --reference-doc=plantilla.docx -o salida.docx
Comparativa DOCX vs DOC vs ODT vs RTF
| Característica | DOCX | DOC (binario) | ODT | RTF |
|---|---|---|---|---|
| Formato | ZIP + XML | Binario | ZIP + XML (ODF) | Texto plano |
| Estándar | ISO/IEC 29500 | Propietario (MS) | ISO/IEC 26300 | Spec parcial |
| Abierto | Parcial | No | Sí | Sí |
| Control de cambios | Sí | Sí | Sí | Limitado |
| Compatibilidad Word | Nativa | Nativa | Buena | Buena |
| Mejor para | Flujo de trabajo MS Office | Word legacy | Flujo de trabajo open source | Intercambio entre apps |
Resumen
DOCX es fundamentalmente un archivo ZIP de ficheros XML — una vez que entiendes esto, el formato se vuelve inspeccionable, automatizable y programable. La biblioteca python-docx hace que leer y escribir DOCX sea sencillo para desarrolladores Python, mientras que Pandoc maneja la conversión de formato a PDF, HTML, Markdown y EPUB. Para la generación de documentos en el lado del servidor a escala, DOCX es el formato objetivo correcto cuando los consumidores necesitan compatibilidad con Microsoft Word.
Conversiones relacionadas
Conversiones de documento que siguen este tema: