web-dev-qa-db-fra.com

Objet XlsxWriter enregistré en tant que réponse http pour créer le téléchargement dans Django

L'objet XlsxWriter est enregistré en tant que réponse http pour créer un téléchargement dans Django?

35
Waheed Ahmed

Je pense que vous demandez comment créer un fichier Excel en mémoire en utilisant xlsxwriter et le renvoyer via HttpResponse. Voici un exemple:

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

J'espère que cela pourra aider.

54
alecxe

Une petite mise à jour sur la réponse @alecxe pour Python 3 (io.BytesIO au lieu de StringIO.StringIO) et Django> = 1.5 (content_type au lieu de mimetype), avec l'assembly de fichier entièrement en mémoire qui a depuis été implémenté par @jmcnamara ({ 'in_memory': Vrai})!
Voici l'exemple complet:

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
65
Jeb

En ce qui concerne Django, vous pouvez même vous passer de tous les shenanigans StringIO. HttpResponse se comporte comme un StringIO à cet égard:

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: Vous devez spécifier {'in_memory': True} Ou vous pourriez obtenir HttpResponse has no attribute seek(). Merci @Jeb

16
nuts