On a django site, I want to generate an excel file based on some data in the database.
I'm thinking of using xlwt, but it only has a method to save the data to a file. How can get the file to the HttpResponse object? Or maybe do you know a better library?
I've also found this snippet but it doesn't do what I need. All I want is a way to get the stream from the xlwt object to the response object (without writing to a temporary file)
neat package! i didn't know about this
According to the doc, the
save(filename_or_stream) method takes either a filename to save on, or a file-like stream to write on.
And a Django response object happens to be a file-like stream! so just do
xls.save(response). Look the Django docs about generating PDFs with ReportLab to see a similar situation.
edit: (adapted from ShawnMilo's comment):
def xls_to_response(xls, fname): response = HttpResponse(mimetype="application/ms-excel") response['Content-Disposition'] = 'attachment; filename=%s' % fname xls.save(response) return response
then, from your view function, just create the
xls object and finish with
***UPDATE: django-excel-templates no longer being maintained, instead try Marmir http://brianray.github.com/mm/
Still in development as I type this but http://code.google.com/p/django-excel-templates/ Django excel templates project aims to do what your asking.
Specifically look at the tests. Here is a simple case:
# from django_excel_templates import * from django_excel_templates.color_converter import * from models import * from django.http import HttpResponse def xls_simple(request): ## Simple ## testobj = Book.objects.all() formatter = ExcelFormatter() simpleStyle = ExcelStyle(vert=2,wrap=1) formatter.addBodyStyle(simpleStyle) formatter.setWidth('name,category,publish_date,bought_on',3000) formatter.setWidth('price',600) formatter.setWidth('ebook',1200) formatter.setWidth('about',20000) simple_report = ExcelReport() simple_report.addSheet("TestSimple") filter = ExcelFilter(order='name,category,publish_date,about,bought_on,price,ebook') simple_report.addQuerySet(testobj,REPORT_HORZ,formatter, filter) response = HttpResponse(simple_report.writeReport(),mimetype='application/ms-excel') response['Content-Disposition'] = 'attachment; filename=simple_test.xls' return response