Revista Informática

Creación de documentos Word con Python

Publicado el 07 septiembre 2020 por Daniel Rodríguez @analyticslane

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.

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.

Creación de documentos Word con Python
Documento de Word creado con Python

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.

Imagen de Devanath en Pixabay

Contenido relacionado


Publicidad


Volver a la Portada de Logo Paperblog