XlsxWriter object save as http response to create download in Django

前端 未结 3 1886
佛祖请我去吃肉
佛祖请我去吃肉 2020-11-30 19:42

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

相关标签:
3条回答
  • 2020-11-30 20:05

    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 io
    
    from django.http.response import HttpResponse
    
    from xlsxwriter.workbook import Workbook
    
    
    def 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
    
    0 讨论(0)
  • 2020-11-30 20:08

    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 HttpResponse
    from xlsxwriter.workbook import Workbook
    
    def 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

    0 讨论(0)
  • 2020-11-30 20:21

    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 StringIO
    except ImportError:
        import StringIO
    
    from django.http import HttpResponse
    
    from xlsxwriter.workbook import Workbook
    
    
    def 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.

    0 讨论(0)
提交回复
热议问题