XlsxWriter object save as http response to create download in Django XlsxWriter object save as http response to create download in Django python python

XlsxWriter object save as http response to create download in Django


A little update on @alecxe response for Python 3 (io.BytesIO instead of StringIO.StringIO) and Django >= 1.5 (content_type instead of mimetype), with the fully in-memory file assembly that has since been implemented by @jmcnamara ({'in_memory': True}) !
Here is the full example :

import iofrom django.http.response import HttpResponsefrom xlsxwriter.workbook import Workbookdef your_view(request):    output = io.BytesIO()    workbook = Workbook(output, {'in_memory': True})    worksheet = workbook.add_worksheet()    worksheet.write(0, 0, 'Hello, world!')    workbook.close()    output.seek(0)    response = HttpResponse(output.read(), content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")    response['Content-Disposition'] = "attachment; filename=test.xlsx"    output.close()    return response


I think you're asking about how to create an excel file in memory using xlsxwriter and return it via HttpResponse. Here's an example:

try:    import cStringIO as StringIOexcept ImportError:    import StringIOfrom django.http import HttpResponsefrom xlsxwriter.workbook import Workbookdef your_view(request):    # your view logic here    # create a workbook in memory    output = StringIO.StringIO()    book = Workbook(output)    sheet = book.add_worksheet('test')           sheet.write(0, 0, 'Hello, world!')    book.close()    # construct response    output.seek(0)    response = HttpResponse(output.read(), mimetype="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")    response['Content-Disposition'] = "attachment; filename=test.xlsx"    return response

Hope that helps.


When it comes to Django, you can even do without the whole StringIO shenanigans. HttpResponse behaves just like a StringIO in that respect:

from django.http import HttpResponsefrom xlsxwriter.workbook import Workbookdef your_view(request):    # your view logic here    # create the HttpResponse object ...    response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')    response['Content-Disposition'] = "attachment; filename=test.xlsx"    # .. and pass it into the XLSXWriter    book = Workbook(response, {'in_memory': True})    sheet = book.add_worksheet('test')           sheet.write(0, 0, 'Hello, world!')    book.close()    return response

Addendum: You need to specify {'in_memory': True} or you might get HttpResponse has no attribute seek(). Thanks @Jeb