Generar ficheros excel con Python


pyExcelerator es un módulo Python creado por Roman V. Kiseliov para escribir y leer datos en formato excel. Se necesita una versión superior a la 2.4 de python. La ventaja (opinión) de usar este módulo frente a otros como CSV, es que permite formatos unicode, se lee/escribe bien tanto en OpenOffice como en Microsoft Office y tiene una API muy sencilla. 


Instalar módulo en Ubuntu

$ sudo apt-get install python-excelerator


Lo básico

Una vez instalado, vamos a lo básico. Comenzaremos por escribir algo. Decir que, si nos descargamos el módulo en http://sourceforge.net/projects/pyexcelerator/ , en él hay muchísimos ejemplos que nos pueden servir de guía para lo que queramos hacer.

____________________________________________

from pyExcelerator import *

# Instance the objects
workbook = Workbook()
worksheet = workbook.add_sheet("my first sheet")

# Write a row
worksheet.write(1, 1, "Example")
# Save the content
workbook.save('file.xls')

______________________________________

Lo que se hace es, instanciar un libro de trabajo y una hoja. Podemos  crear tantas hojas de trabajo como queramos. A continuación escribimos en la posición (1,1) la palabra Example y guardamos con el nombre file.xls. 


Dar formato

También podemos escribir con distintos tipos de letra, colores, cursiva, etc. Esto lo podemos hacer mediante la clase Font del módulo. Con el font, le indicamos todas las propiedades necesarias. 

______________________________________
 
from pyExcelerator import *

# Instance the objects
workbook = Workbook()
worksheet = workbook.add_sheet("my first sheet")


# Style 

font = Font()
font.name  = "Arial"
font.colour_index = 1
font.bold = True
style = XFStyle()
style.font = font

# Write
worksheet.write(1, 1, "Example", style)

# Save the content
workbook.save('file.xls')

______________________________________

Esto también se puede hacer sobre el objeto style, puesto que internamente usa Font.


Leer a formato CSV

Para leer y poder procesar los datos, usamos la función parse_xls, a la que le pasamos un fichero y la codificación, que puede ser utf-8. Esta función, retorna todas las hojas worksheet y sus valores, por lo que tenemos que recorrerlas y por ejemplo, insertarlas en una matriz. A continuación se lista un ejemplo completo de como hacer esto. El siguiente código es una adaptación del código del autor del directorio examples.


Ejemplo completo
______________________________________
# -*- coding: utf-8 -*- 

# This example was adapted from Roman V. Kiseliov
# in examples section project

from pyExcelerator import *

class Excel(object):
    def __init__(self, name_space='0'):
        self.column = 0
        self.row = 0
        self.workbook = Workbook()
        self.worksheet = self.workbook.add_sheet(name_space)

    def write_row(self, content):
        self.column = 0
        for i in content:
            self.worksheet.write(self.row, self.column, i)
            self.column += 1
        self.row += 1

    def write_with_format(self, content, bold=False, name='Arial', colour_index=4):
        font = Font()
        font.name = name
        font.colour_index = colour_index
        font.bold = bold
        style = XFStyle()
        style.font = font
        self.column = 0
        for i in content:
            self.worksheet.write(self.row, self.column, i, style)
            self.column += 1
        self.row += 1   

    def save(self, filename='file.xls'):
        self.workbook.save(filename)

    @classmethod
    def read(self, filename, coding='utf-8', verbose=False):
        for sheet_name, values in parse_xls(filename, coding):
            matrix = [[]]
            if verbose:
                print 'Sheet = "%s"' % sheet_name.encode(coding,  'backslashreplace')
                print '----------------'
            for row_idx, col_idx in sorted(values.keys()):
                v = values[(row_idx, col_idx)]
                if isinstance(v, unicode):
                    v = v.encode(coding, 'backslashreplace')
                else:
                    v = `v`
                v = '%s' % v.strip()
                last_row, last_col = len(matrix), len(matrix[-1])
                while last_row <= row_idx:
                    matrix.extend([[]])
                    last_row = len(matrix)
                while last_col < col_idx:
                    matrix[-1].extend([''])
                    last_col = len(matrix[-1])
                matrix[-1].extend([v]    
            if verbose:
                for row in matrix:
                    csv_row = ', '.join(row)
                    print csv_row
        return matrix

if __name__ == '__main__':
    print 'Generando xls ........... ',
    header = ['Nombre', 'Apellidos', 'DNI']
    excel = Excel()
    excel.write_with_format(header, bold=True)
    datos = [u'Tutú', u'Tiñi', '1239812H']
    excel.write_row(datos)
    datos = [u'Kaká', u'Asd', '8712382H']
    excel.write_row(datos)
    excel.save()
    print 'ok'

    print 'Leyendo datos ........... '
    Excel.read('file.xls', verbose=True)
    print '................... ok '
______________________________________

Este módulo contiene muchísimas más cosas. Escritura de fórmulas, imágenes, estilos, conversión a html, etc. En la sección de ejemplos del proyecto se puede ver en detalle todo esto. 


Referencias

0 comentarios:

Publicar un comentario en la entrada

Por favor, no escriba al estilo SMS y use signos de puntuación en caso necesario