python - L'oggetto XlsxWriter salva come risposta http per creare download in Django




excel httpresponse (4)

L'oggetto XlsxWriter salva come risposta http per creare il download in Django?


Answers

Quando si tratta di Django, si può anche fare a meno di tutti gli shenanigans di StringIO . HttpResponse comporta proprio come un StringIO in questo senso:

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: è necessario specificare {'in_memory': True} o si potrebbe ottenere HttpResponse has no attribute seek() . Grazie a @Jeb


Penso che tu stia chiedendo come creare un file excel in memoria usando xlsxwriter e restituirlo tramite HttpResponse . Ecco un esempio:

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

Spero possa aiutare.


Un piccolo aggiornamento sulla risposta @alecxe per Python 3 ( io.BytesIO invece di StringIO.StringIO ) e Django> = 1.5 ( content_type invece di mimetype ), con l'assembly di file completamente in-memory che è stato implementato da @jmcnamara ( { 'in_memory': True} )!
Ecco l'esempio completo:

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

È un po 'hacker, ma un'opzione se non vuoi evitare le importazioni:

def isclass(obj):
    try:
        issubclass(obj, object)
    except TypeError:
        return False
    else:
        return True






python django excel httpresponse xlsxwriter