L'objet XlsxWriter est enregistré en tant que réponse http pour créer un téléchargement dans Django?
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.
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
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