Y siguiendo con lo retos, ahora el primero es como adicionar estilos y formatos a un celda de un archivo xls desde Python por su puesto, hee que si fuera desde Calc o Excel sería pan comido o talves no! …

Los obtejtivos que me interesa poder lograr son:

  1. Asignar tipo de fuente
  2. Asignar tipo de letra
  3. Asignar tamaño de letra
  4. Asignar alineación
  5. Asignar borde
  6. Asignar formato
  7. Asignar ancho y alto

Sigo trabajando con la la clase xls_writer.py que hasta el momento me ha resultado genial y que invita incluso a extenderla para incluir nuevos métodos, sin embargo la documentación viene de la mano de xlwt.

Hay una clase llamada xlwt.easyxf que formatea una cadena del tipo ‘font: bold on; align: wrap on, vert centre, horiz center’ y regresa una instancia que puede ser usando en el método sheet.write, un ejemplo sería como el sigue:

from xlwt import *
from xls_writer import XLSWriter

ezxf = easyxf

writer = XLSWriter()

data = ["Negrilla", "Centrada", u"Centrada y con corte de línea"]
format = [ezxf('font: bold on'), ezxf('align: horiz center'), ezxf('align: wrap on, horiz center')]
writer.append(data, format)

writer.save("test.xls")

el resultado es el siguiente:
en la centrada con corte de línea he tenido que expandir la altura del renglón manualmente y en automático se ajusto el texto, pero como el espacio del ancho de la celda no daba espacio para mostrar todo el texto, éste se mostraba incompleto, así que también he modificado el ancho a mano, por lo tanto he agregado otro objetivo más 😉

También comentar que he tenido que modificar el método writer.append() para que acepte la opción del formato en xls_writer.py

Con el anterior ejemplo se cumplen los puntos 2 y 4… seguimos con un ejemplo que muestra como darle formato a un celda de tipo moneda, a otra celda de tipo fecha y la última celda es sin formato:


data = [12345.67890, datetime.today(), u"Centrada y con corte de línea"]
format = [ezxf('font: bold on', num_format_str='$#,##0.00'), ezxf(num_format_str='yyyy-mm-dd'), ezxf()]
writer.append(data, format)

y el resultado es:

con esto tenemos el punto 6…

Ahora para colocar un tipo de fuente en particular y definir su tamaño se realiza de la siguiente manera:

data = ['Bold, 15, Times New Roman', datetime.today(), u"Centrada y con corte de línea"]
format = [ezxf('font: bold on, height 300, name Times New Roman', num_format_str='$#,##0.00'), ezxf('font: italic on', num_format_str='yyyy-mm-dd'), ezxf()]
writer.append(data, format)

para obtener:

con esto se tienen ya los puntos 1, 2, 3, 4 y 6 faltan 5 y 7

Para el borde también hay una opción veamos como utilizarla

data = ['','Bordes','']
format = [ezxf(),ezxf('font: bold on, height 300, name Times New Roman; borders: left thin, right medium, top dashed, bottom double', num_format_str='$#,##0.00'), ezxf()]
writer.append(data, format)

y el resultado es

sin embargo el ancho y alto de cada fila y columna lo tengo que definir manualmente, así que vamos a eso, que Python se encargue de ello!!!

width = [0x0d00*3, 0x0d00*2, 0x0dFF]
height = 0x00FF * 2
writer.append(data, format, width, height)

con las anteriores líneas y unas modificaciones nuevamente al archivo xls_writer.py se logra obtener lo siguiente

en este caso la anchura y altura de cada renglón y columna es definida por el script en Python, genial!!

De esta forma se puede crear prácticamente cualquier archivo que se necesite en formato xls desde Python e incluso desde sistemas Linux sin la necesidad de librerías extras… así o más sencillo!

Comentarios, comentarios!

Salud!!