quinta-feira, 14 de abril de 2011

Gerando planilhas Excel no Django

Gestores e usuários adoram planilhas! Vocês já se perguntaram por que? Por um único motivo: liberdade! Com planilhas, o usuário fica livre do jugo do pessoal de TI e passa a ter o poder de manipular seus preciosos dados como bem entenderem, sem que um analista de sistema (nós) venha limitar o trabalho dele com questões arcanas tais como integridade, concorrência, etc.

Brincadeiras a parte, ao liberar os dados de seus sistemas utilizando o formato XML, você permite que seus usuários possam manipular o resultado de um relatório, agrupando os dados conforme suas necessidades, criando suas visões de dados, gráficos, etc sem depender de customizações do "pessoal de TI".

Para gerar planilhas no formato Excel, utilizei 2 bibliotecas: xlwt e django-excel-templates. A xlwt é a biblioteca de "baixo nível" que trata das minúcias e bits-e-bytes do formato XLS. Com ela é possível manipular cada elemento de uma célula, tais como fonte, borda, etc.

Já a biblioteca django-excel-templates tenta abstrair alguns detalhes da planilha, se preocupando em listar o conteúdo de um QuerySet do django. Antes de vermos a instalação, segue um exemplo de utilização do django-excel-templates:

from django_excel_templates import *
from django_excel_templates.color_converter import *
from models import *
from django.http import HttpResponse


def exemplo_excel(request):



   planilha = ExcelReport() 
   planilha.addSheet("Plano 1")
   dataset = Aluno.objects.all()
   headerstyle = ExcelStyle(font_color='FFFFFF',bold=True,pattern_color='000080',pattern=1)

   mediumFormatter = ExcelFormatter()
   mediumFormatter.addHeaderStyle(headerstyle)
   planilha.addFormatter(mediumFormatter)
  
planilha.addQuerySet(dataset,REPORT_HORZ,True)
   response = HttpResponse(planilha.writeReport(),mimetype='application/ms-excel')
   response['Content-Disposition'] = 'attachment; filename=teste.xls'
   return response


Ou seja, com poucas linhas, você disponibiliza uma planilha diretamente no browser sem a necessidade de arquivos temporários ou artifícios semelhantes.

Entretanto, nem tudo é uma maravilha: existem limitações nas bibliotecas que impedem vôos mais altos na manipulação de planilhas, tais como iniciar a carga a partir de uma planilha já existente e incluir figuras. Bem, acredito que são limitações pois até agora não consegui fazer, nem achei no código onde isso fique claro.

Nos próximos posts, vou tentar listar as experiências que estou fazendo com as duas bibliotecas com o Django, como integrar com Admin e como fazer consultas complexas retornando um ValueSet.