Xlsxwriter: escribiendo archivos Excel desde Python

Como comentaba en el primer post de esta nueva etapa actualmente con lo que mas estoy progrando es con Python. Y me surgió el problema de tener que generar archivos de Excel desde Linux. Y tras una búsqueda muy corta en Google, me encontré con esta página. Muy buena idea la de armar un guía así. Y buscando encontré lo que necesitaba: xlsxwriter.

Xlsxwriter es un modulo de Python que permite crear archivos xlsx. La contra que tiene es que no permite modificar archivos existentes ni leer información, pero como no necesito ninguna de esas dos cosas por ahora, no me molesta. Pero en lo que si hace, es un paquete muy bueno. Tranquilamente se pueden crear libros de Excel que aparenten haber sido creados desde el mismo Excel. Inserción de fórmulas, formateo de celdas, gráficos, validaciones y hasta código VBA permite realizar xlsxwriter. Y todo sin necesidad de tener instalado el MS Excel y funciona incluso desde Linux.

Lo mas básico que se me ocurre que puede querer realizar un usuario con este módulo es pasar un conjunto de datos a una tabla:

#!/usr/bin/env python
#coding:utf-8
import xlsxwriter

datos = [{'item1':'foo', 'item2':'baz', 'item3':'bar' }, {'item1':'1', 'item2':'2', 'item3':'3' }]

# Seteo las filay columna inicial
row = 0
col = 0

# Creo el libro y le agrego una hoja
workbook = xlsxwriter.Workbook('tablaSimple.xlsx')
worksheet = workbook.add_worksheet()

# Escribo el encabezado de la tabla
worksheet.write(row, col, 'item1')
worksheet.write(row, col + 1, 'item2')
worksheet.write(row, col + 2, 'item3')
row += 1

# Lleno la tabla de datos
for elem in datos:
    worksheet.write(row, col, elem['item1'])
    worksheet.write(row, col + 1, elem['item2'])
    worksheet.write(row, col + 2, elem['item3'])
    row += 1

workbook.close()

Podemos modificar un poco el código para que quede formateada:

#!/usr/bin/env python
#coding:utf-8
import xlsxwriter

datos = [{'item1':'foo', 'item2':'baz', 'item3':'bar' }, {'item1':'1', 'item2':'2', 'item3':'3' }]

# Seteo las filay columna inicial
row = 0
col = 0

# Creo el libro y le agrego una hoja
workbook = xlsxwriter.Workbook('tablaConFormato.xlsx')
worksheet = workbook.add_worksheet()

# Creo los formatos
encabezado = workbook.add_format({'bold': True, 'bg_color':'blue'})
filaGris = workbook.add_format({'bg_color':'gray'})
filaBlanca = workbook.add_format({})

# Escribo el encabezado de la tabla
worksheet.write(row, col, 'item1', encabezado)
worksheet.write(row, col + 1, 'item2', encabezado)
worksheet.write(row, col + 2, 'item3', encabezado)
row += 1

# Lleno la tabla de datos
for elem in datos:
    if row%2==0:
      tipoFila = filaGris
    else:
      tipoFila = filaBlanca
  
    worksheet.write(row, col, elem['item1'], tipoFila)
    worksheet.write(row, col + 1, elem['item2'], tipoFila)
    worksheet.write(row, col + 2, elem['item3'], tipoFila)
    row += 1

workbook.close()

Y también insertar algunas fórmulas

#!/usr/bin/env python
#coding:utf-8
import xlsxwriter

datos = [{'item1':1, 'item2':2, 'item3':3 }, {'item1':1, 'item2':3, 'item3':5 }]

# Seteo las filay columna inicial
row = 0
col = 0

# Creo el libro y le agrego una hoja
workbook = xlsxwriter.Workbook('tablaConFormulas.xlsx')
worksheet = workbook.add_worksheet()

# Creo los formatos
encabezado = workbook.add_format({'bold': True, 'bg_color':'blue'})
filaGris = workbook.add_format({'bg_color':'gray'})
filaBlanca = workbook.add_format({})

# Escribo el encabezado de la tabla
worksheet.write(row, col, 'item1', encabezado)
worksheet.write(row, col + 1, 'item2', encabezado)
worksheet.write(row, col + 2, 'item3', encabezado)
worksheet.write(row, col + 3, 'suma', encabezado)
row += 1

# Lleno la tabla de datos
for elem in datos:
    if row%2==0:
      tipoFila = filaGris
    else:
      tipoFila = filaBlanca
  
    worksheet.write(row, col, elem['item1'], tipoFila)
    worksheet.write(row, col + 1, elem['item2'], tipoFila)
    worksheet.write(row, col + 2, elem['item3'], tipoFila)

    rangoSuma = 'A' + str(row+1) +':C'+str(row+1) # Para formulas se comienza a indexar por 1
    worksheet.write_formula(row, col + 3, '=+SUM(' + rangoSuma + ')', tipoFila)
    row += 1

workbook.close()

Como ven, es relativamente sencillo y, lo mejor, tiene una documentación muy completa, con ejemplos de casi todo.