Cómo crear un libro Excel a partir de otro en Python conservando las imágenes y el texto enriquecido

Leer y grabar un libro Excel con Python es muy sencillo utilizando la librería openpyxl, la cual permite hacer multitud de operaciones con archivos Excel y además está muy bien documentada.

Sin embargo, si queremos que al crear un libro a partir de otro que nos sirve de plantilla se mantengan tanto las imágenes como el texto enriquecido, es necesario tener en cuenta lo siguiente:

Para que toda la funcionalidad de openpyxl esté disponible, tenemos que instalar también los paquetes pillow y lxml en el entorno virtual en el que estemos ejecutando el programa. La librería lxml es importante sobre todo para que cuando grabemos el contenido de una celda, si el texto de ésta tiene diferentes formatos (por ejemplo parte es negrita, parte es cursiva o aparecen superíndices) dicho texto se mantenga tal cual está en el original. Sin esta librería se aplicará a toda la celda un único formato de texto.

Otra cosa que hay que tener en cuenta es que al abrir el archivo para leerlo en el código, tenemos que incluir explícitamente la opción rich_text=True, porque por defecto viene a False.

from openpyxl import load_workbook
wb = load_workbook(filename=excel_base, rich_text=True)

La imágenes que existan en el archivo original se van a copiar al archivo destino solamente si en origen están como objeto de Office, si están incrustadas como imagen no se van a copiar. Para comprobarlo, la manera más fácil es abrir el archivo origen, hacer click derecho sobre la imagen y seleccionar «Modificar». Si al hacerlo nos aparece este mensaje:

Tenemos que pulsar en «Sí», de forma que la imagen se guarde como objeto de dibujo de Office. Guardamos el archivo y cuando lo copiemos ya aparecerán las imágenes en la copia.

Teniendo en cuenta estas consideraciones, podremos replicar libros Excel con Python sin perder nada del archivo original.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *