django excel xlwt

Question!

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)



Answers

***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
By : brianray




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

return xls_to_response(xls,'foo.xls')
By : Javier


This video can help you solving your question :)
By: admin