
Los archivos de Microsoft Word son un estándar para el intercambio de documentos de texto enriquecido. Pudiéndose incluir en los mismos imágenes, tablas y lista, entre otros tipos recursos. Además, es un formato que el rector del mismo puede editar con facilidad, a diferencia de los archivos en PDF. Por lo que tener la posibilidad de crear documentos de Word con Python nos puede facilitar la creación de informes en este formato. Algo que se puede conseguir con el paquete de Python python-docx
.
Tabla de contenidos
Instalación de python-docx
El paquete python-docx
se puede instalar fácilmente con pip
, para lo que sera necesario escribir en la terminal el comando
pip install python-docx
Es necesario instalar el paquete python-docx
, aunque existe un paquete que se llama docx
este último es una versión legacy de python-docx
.
Documentos Word con Python
Para crear un documento de Microsoft Word con Python tenemos que importar Document
de docx
. Este constructor es el que crea el documento. Documento al que ahora tendremos que añadir las propiedades que nos interesen.
from docx import Document # Creación del documento document = Document()
Agregar un título
Una vez hecho esto se puede añadir el título al documento, para lo que se utiliza el método add_heading
. Un método que tiene dos propiedades, la primera el texto del propio título y el segundo el nivel. Usándose 0 para el título principal y 1 para el título de nivel 1, 2 para el de nivel 2 y así consecutivamente.

# Añadimos un titulo al documento, a nivel 0 document.add_heading('Documento creado con Python', 0)
Agregar un párrafo
Posiblemente lo que más usemos sean los párrafos, los cuales se crean con el método add_paragraph
. Si no necesitamos usar formatos, se puede incluir el contenido del párrafo directamente en la propiedad del método. Pero, si queremos usar negritas o itálicas en parte del párrafo será necesario obtener el objeto que devuelve este método para poder editarlo.
En el objeto que devuelve el método add_paragraph
se puede agregar más contenido con el método add_run
. Al igual que el caso anterior el texto se agrega mediante la propiedad y pudiéndose modificar cualquier propiedad de este como bold
o italic
. Como se muestra en el siguiente ejemplo:
# Añadimos un párrafo p = document.add_paragraph('El contenido de los párrafos se añadir en varias líneas. ') p.add_run('Pudiéndose configurar que el texto tenga formato tipo ') p.add_run('negrita').bold = True p.add_run(' o ') p.add_run('itálica.').italic = True
Agregar listas numeradas y viñetas
Tanto las listas numeradas como las viñetas son párrafos con un estilo particular que se debe indicar mediante el parámetro opcional style
del método add_paragraph
. En concreto el estilo de las listas enumeradas es List Number
y el de las viñetas es List Bullet. Las formas de crear ambas listas se pueden ver en el siguiente ejemplo:
# Para indicar subtitulo se indica el nivel 1 document.add_heading('Subtitulo', level=1) document.add_paragraph('Ahora se puede crear una enumeración') document.add_paragraph('Uno', style='List Number') document.add_paragraph('Dos', style='List Number') document.add_paragraph('Tres', style='List Number') document.add_paragraph('O viñetas') document.add_paragraph('Manzana', style='List Bullet') document.add_paragraph('Pera', style='List Bullet') document.add_paragraph('Naranja', style='List Bullet')
Importación de imágenes
Una parte importante de los informes son las imágenes. Ya que facilitan la inclusión de gráficas, fotografías y otros recursos gráficos. Para esto contamos con el método add_picture
al cual se es necesario pasarle como primer parámetro la ruta, opcionalmente se le puede indicar el tamaño que debe tener la imagen en el documento mediante las propiedades width
o height
. Tamaños que se deben indicar con objetos Cm
, para indicar el tamaño en centimetros, Inches
, para indicar el tamaño en pulgadas, u otros que podemos encontrar en el espacio de nombres docx.shared
. Así para importar una imagen que tendrá un tamaño de 5 centímetros se puede usar el siguiente ejemplo
from docx.shared import Cm # Imágenes document.add_heading('Imágenes', level=1) document.add_picture('analytics_lane.jpg', width=Cm(5))
Creación de tablas
Otros recursos habituales en los documentos de texto son las tablas. Objetos que en este caso requieren algo más de trabajo. Para crearlas primero es necesario crear una tabla mediante el método add_table
que tiene dos parámetros: el número de filas (rows
) y columnas (cols
). El número de filas no es importante ya que siempre se pueden agregar más filas a las tablas.
Para trabajar con las tablas es importante guardar el objeto que nos devuelve el método add_table
, ya que lo necesitamos para agregar el contenido. Este objeto tiene la propiedad rows
que es una lista que tiene la propiedad cells
en donde se encuentra cada una de las celdas de la tabla. El texto que incluimos en la tabla se tiene que indicar en la propiedad text
de cada celda. Por ejemplo, para incluir los títulos de una tabla se hará.
# Tablas document.add_heading('Tablas', level=1) data = (('Manzana', 12), ('Pera', 5), ('Naranja', 12)) table = document.add_table(rows=1, cols=2) table.rows[0].cells[0].text = 'Fruta' table.rows[0].cells[1].text = 'Cantidad'
Ahora si tenemos una lista o una tupla con los datos solo es necesario iterar sobre ella creando una fila en cada interacción mediante el método add_row
. Fila que contendrá una lista con las celdas de esta.
for prod, numbr in data: row_cells = table.add_row().cells row_cells[0].text = prod row_cells[1].text = str(numbr)
Como se muestra en el ejemplo es importante notar que la propiedad text
de las celdas es un texto, por lo que si tenemos los datos en formato numérico es necesario convertirlos antes de añadirlos.
Guardar el documento
Finalmente tendremos que guardar el documento para poder enviarlo. Lo que se puede hacer con el método save
en el que únicamente se le debe indicar el nombre del archivo en el que se desea guardar este.
document.save('ejemplo.docx')
Creación de un documento
Posiblemente la mejor manera de ver todo esto es mediante un ejemplo. Si juntamos todo los que hemos hecho hasta ahora tenemos el siguiente código de Python.
from docx import Document from docx.shared import Cm # Creación del documento document = Document() # Añadimos un titulo al documento, a nivel 0 document.add_heading('Documento creado con Python', 0) # Añadimos un párrafo p = document.add_paragraph('El contenido de los párrafos se añadir en varias líneas. ') p.add_run('Pudiéndose configurar que el texto tenga formato tipo ') p.add_run('negrita').bold = True p.add_run(' o ') p.add_run('itálica.').italic = True # Para indicar subtitulo se indica el nivel 1 document.add_heading('Subtitulo', level=1) document.add_paragraph('Ahora se puede crear una enumeración') document.add_paragraph('Uno', style='List Number') document.add_paragraph('Dos', style='List Number') document.add_paragraph('Tres', style='List Number') document.add_paragraph('O viñetas') document.add_paragraph('Manzana', style='List Bullet') document.add_paragraph('Pera', style='List Bullet') document.add_paragraph('Naranja', style='List Bullet') # Imágenes document.add_heading('Imágenes', level=1) document.add_picture('analytics_lane.jpg', width=Cm(5)) # Tablas document.add_heading('Tablas', level=1) data = (('Manzana', 12), ('Pera', 5), ('Naranja', 12)) table = document.add_table(rows=1, cols=2) table.rows[0].cells[0].text = 'Fruta' table.rows[0].cells[1].text = 'Cantidad' for prod, numbr in data: row_cells = table.add_row().cells row_cells[0].text = prod row_cells[1].text = str(numbr) document.save('ejemplo.docx')
Un código que sí lo ejecutamos genera el siguiente documento de Word.

Conclusiones
En esta entrada hemos visto cómo crear documentos de Word con Python. Una herramienta que nos facilita la creación de informes automáticos de los resultados de nuestro código. Algo que nos puede ahorrar mucho tiempo y que tiene muchas más posibilidades como se puede ver en la documentación del paquete.
Lo que hemos visto es un complemento a la creación de informes con Excel, los cuales también puede ser complejos con múltiples tablas, ya que en el caso de Word se puede incluir texto e imágenes además de los datos.
Hola, ¿en el caso de tener un CRUD ya hecho como podría hacer un reporte del mismo con python-docx?
En caso de tener los datos en memoria no hay mas que importar la librería y crear un documento tal como se explica en la entrada.
En el caso que quiera darle estilo al word, como seria?
Para modificar el formato tendrás modificar las propiedades de los objetos creados. Por ejemplo, los párrafos tiene la propiedad ParagraphFormat (https://python-docx.readthedocs.io/en/latest/api/text.html#paragraphformat-objects), en la que existen múltiples opciones para configurar el formato.
Muy buen aporte muchas gracias. Para aquellas personas que queremos mantenernos dentro del software libre, ¿sabes si hay alguna herramienta similar a esta pero para usar con LibreOffice? (por ejemplo para hacer documentos de LibreOffice Writer o planillas de cálculo de LibreOffice Calc?
Hay soluciones para trabajar con el formato OpenDocument desde Python como odfpy (https://github.com/eea/odfpy), pero nunca las he usado.
Excelente aporte!, una pregunta, se puede insertar objetos al documento .doc, algo asi como incrustar un pdf, excel u otro archivo?
Gracias, que yo sepa no se puede agregar objetos al documento Word con python-docx.
Hola,
¿Sabes si hay algún problema para escribir fórmulas matemáticas? Word tiene la opción de añadir fórmulas, ¿cómo podemos hacer esto desde Python?
Gracias
Un saludo
No he visto ningún método para crear ecuaciones de Word en la documentación del paquete. Generalmente lo suelo usar para generar informes automáticos. Una opción puede ser crear las ecuaciones con LaTeX, expórtalas a una imagen y adjuntarlas al documento.
Les puede interesar: AUTOMATIZA WORD CON PYTHON
Enlace video 1:
https://www.youtube.com/watch?v=70eyxpF-h8g&t=67s
Enlace video 1:
https://www.youtube.com/watch?v=o5zM3T9Fpcc
Por si les interesa, explico todo esto paso a paso en el siguiente video:
https://www.youtube.com/watch?v=fBrRZGTSEAg&t=685s
amigo como se haria para colocar encabezado y pide pagina además de exportarlo de una base de datos como mysql gracias
Hola, agregar encabezados y pies de página es sencillo. python-docx incluye propiedades llamadas header y footer que permiten insertar texto en estas secciones, como se muestra en el siguiente ejemplo:
from docx import Document
# Crear un documento nuevo o cargar uno existente
doc = Document()
# Agregar contenido al encabezado
doc.sections[0].header.paragraphs[0].text = "Este es el encabezado del documento"
# Agregar contenido al pie de página
doc.sections[0].footer.paragraphs[0].text = "Este es el pie de página del documento"
# Guardar el documento
doc.save("encabezado_y_pie.docx")
Para trabajar con una base de datos, el proceso es algo más complejo. Primero, necesitas conectarte a la base de datos (aunque no trabajo específicamente con MySQL, el procedimiento es similar al de otras bases de datos). Una vez conectado, puedes descargar los datos y usarlos para crear una tabla en el documento. Si descargas los datos en un DataFrame, el proceso no es complicado. Por ejemplo, puedes usar:
# Agregar un título al documento
doc.add_heading("Tabla generada desde un DataFrame", level=1)
# Crear una tabla en el documento
table = doc.add_table(rows=1, cols=len(df.columns))
# Agregar encabezados a la tabla
header_cells = table.rows[0].cells
for i, column_name in enumerate(df.columns):
header_cells[i].text = column_name
# Agregar las filas de datos
for _, row in df.iterrows():
row_cells = table.add_row().cells
for i, value in enumerate(row):
row_cells[i].text = str(value)
Si este tema resulta de interés, podríamos desarrollar una entrada más detallada para explorarlo en profundidad.