Bookmark and Share

Generare file Excel XLS dinamicamente

Utilizzando la libreria Python pyExcelerator è possibile generare automaticamente file Excel XLS, con dati e formule dinamici.

by Davide Moro - 2009-01-28
Generare file Excel XLS dinamicamente

Supponi di voler generare automaticamente dei file Excel XLS per formattare dei dati in tuo possesso ed introducendo elementi di dinamicità quali per esempio formule e statistiche.

Un possibile caso d'uso potrebbe essere: integrare nella tua applicazione Web una funzionalità che permetta di scaricare ed usare un file XLS generato automaticamente dal sistema e corredato da utili formule e statistiche. Una volta scaricato il file può essere aperto con OpenOffice o Excel, modificato manualmente o stamparli, ecc.

Con Python è possibile fare tutto ciò con poso sforzo utilizzando la liberia pyExcelerator per esempio.

Qui di seguito ecco del codice di esempio che mostra come creare un file XLS chiamato demo.xls. Una volta presa confidenza con la libreria è praticamente immediato includere delle logiche simili nel CMS Plone.

Quindi installa pyExcelerator, crea un file demo.py contenente il seguente codice ed eseguilo, otterrai il seguente file come risultato: demo.xls.

# demo.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

# Autore: Davide Moro <davide.moro@redomino.com>


from pyExcelerator import Workbook
from pyExcelerator import Formula
from pyExcelerator import Font
from pyExcelerator import XFStyle
from pyExcelerator.Utils import rowcol_to_cell
from pyExcelerator.Utils import col_by_name

font = Font()
font.name = 'Verdana'
font.bold = True
font.colour_index = 4

style = XFStyle()
style.font = font


class DemoXLS:
    """ Questa classe creerà un file XLS di esempio, distinto 
        in due fogli.
        Il codice è solo di esempio, quindi non è assolutamente 
        ottimizzato. 
    """
    def __init__(self):
        self.wb = Workbook()
        self.sheet1 = self.wb.add_sheet('Esempio input e formule varie')
        self.sheet2 = self.wb.add_sheet('Esempio risposte quiz e risultati')

    def run_sheet1(self):
        """ 
        Dati due campi numerici input1 ed input2, vengono aggiornati altri
        campi automaticamente grazie alle formule.
        """
        ws = self.sheet1
        
        ws.write_merge(0,0,0,1, 'Esempio input e formule')
        
        ws.write(1, 0, 'Input 1')
        ws.write(1, 1, Formula("2"))
        
        ws.write(2, 0, 'Input 2')
        ws.write(2, 1, Formula("3"))
        
        ws.write(3, 0, 'Moltiplicazione')
        ws.write(3, 1, Formula("B2*B3"))
        
        ws.write(4, 0, 'Somma semplice')
        ws.write(4, 1, Formula("B2+B3"))
        
        ws.write(5, 0, 'Sommatoria')
        ws.write(5, 1, Formula("SUM(B2:B3)"))
        
        ws.write(6, 0, 'Sommatoria complessa')
        ws.write(6, 1, Formula("SUM(B2:B3;B5)"))
        
        ws.write(7, 0, 'Media')
        ws.write(7, 1, Formula("AVERAGE(B2:B3)"))
        
        ws.write(8, 0, 'IF')
        ws.write(8, 1, Formula('IF(B2>B3;"B2>=B3 vero";"B2<B3 falso")'))
        

    def run_sheet2(self):
        """
        Tabella di esempio che si dovrà ottenere:
                domanda1    domanda2    risultato   promosso
        utente1 1           0           1           bocciato
        utente2 5           5           10          promosso
        ...

        Volendo a piacere è possobile aggiungere altre statistiche 
        a piacere (media per singola domanda, media sul risultato 
        finale, numero promossi, ecc).
        Una volta generato il file XLS è poi possibile editarlo 
        manualmente cambiando i valori ed i campi risultato e 
        promosso verranno automaticamente aggiornati grazie alle 
        formule.
        """

        domande = ['Domanda1', 'Domanda2', 'Risultato', 'Promosso']
        risultati = [
                     ['Utente1', (1,0,)],
                     ['Utente2', (5,5,)],
                    ]
        ws = self.sheet2

        # Scrivo l'header
        j = 1
        for domanda in domande:
            ws.write(0, j, domanda)
            j+=1

        # scrivo i risultati
        i = 1
        for risultato in risultati:
            user = risultato[0]
            voti = risultato[1]
            j = 0
            ws.write(i, j, user, style)
            for voto in voti:
                j+=1
                ws.write(i, j, voto)
            rowcol_to_cell(i,j)
            ws.write(i, j+1, Formula("SUM(%s:%s)" % (rowcol_to_cell(i,
                                                                    1,
                                                                    0,
                                                                    1), 
                                                     rowcol_to_cell(i,
                                                                    j,
                                                                    0,
                                                                    1))))
            risultato_cell = rowcol_to_cell(i,j+1) 
            ws.write(i, 
                     j+2, 
                     Formula('IF(%s>6;"PROMOSSO";"BOCCIATO")' % \
                                                       risultato_cell))
            i+=1

    def write(self, filename):
        self.run_sheet1()
        self.run_sheet2()
        self.wb.save(filename)


if __name__ == "__main__":
    xls_gen = DemoXLS()
    xls_gen.write('demo.xls')

Link utili

 

generazione file Excel

Posted by Davide Moro at 2009-07-03 09:18
Altro link utile:
http://www.python-excel.org/

Ma perché non trovo la documentazione???

Posted by Pietro at 2009-09-21 10:36
Ciao,
Mi sai dare qualche suggerimento per reperire la documentazione di questa libreria?
Spero di non doverla generare e spero ci sia... (sgrunt!)

Re: Ma perché non trovo la documentazione???

Posted by Davide Moro at 2009-09-21 10:39
Ciao,
probabilmente non esiste la documentazione per questo pacchetto ma all'interno del codice sorgente troverai una numerosa sezione di esempi che possono esserti utile per partire facilmente con questa libreria.