django excel xlwt

sur un site django, je veux générer un fichier excel basé sur quelques données de la base de données.

je pense à utiliser xlwt, mais il a seulement une méthode pour enregistrer les données dans un fichier. Comment obtenir le fichier vers L'objet HttpResponse? Ou peut-être connaissez-vous une meilleure bibliothèque?

j'ai aussi trouvé ce extrait mais il ne fait pas ce dont j'ai besoin. Tout ce que je veux c'est un moyen d'obtenir le flux de l'objet xlwt à l'objet response (sans écrire à un fichier temporaire)

31
demandé sur jbochi 2009-05-19 19:04:14

6 réponses

emballage soigné! je ne connaissais pas cette

selon le doc, le save(filename_or_stream) méthode prend un nom de fichier pour enregistrer, ou un fichier-comme les flux d'écrire sur.

et un objet de réponse Django se trouve être un flux de type fichier! il suffit donc de ne xls.save(response). Regardez les Django docs à propos de génération de fichiers Pdf avec ReportLab pour voir une situation similaire.

edit: (adapté du commentaire de ShawnMilo):

def xls_to_response(xls, fname):
    response = HttpResponse(mimetype="application/ms-excel")
    response['Content-Disposition'] = 'attachment; filename=%s' % fname
    xls.save(response)
    return response

puis, à partir de votre fonction view, créez simplement le xls objet et terminer par

return xls_to_response(xls,'foo.xls')
51
répondu Javier 2009-11-19 15:26:37

* * * mise à jour: django-excel-les gabarits ne sont plus maintenus, essayez plutôt Marmir http://brianray.github.com/mm/

en cours de développement, comme je l'ai ce type, mais http://code.google.com/p/django-excel-templates/ Django modèles excel projet vise à faire de ce que votre demande.

regardez spécifiquement les tests. Voici un cas simple:

#
from django_excel_templates import *
from django_excel_templates.color_converter import *
from models import *
from django.http import HttpResponse

def xls_simple(request):

    ## Simple ##
    testobj = Book.objects.all()

    formatter = ExcelFormatter()
    simpleStyle = ExcelStyle(vert=2,wrap=1)
    formatter.addBodyStyle(simpleStyle)
    formatter.setWidth('name,category,publish_date,bought_on',3000)
    formatter.setWidth('price',600)
    formatter.setWidth('ebook',1200)
    formatter.setWidth('about',20000)

    simple_report = ExcelReport()
    simple_report.addSheet("TestSimple")
    filter = ExcelFilter(order='name,category,publish_date,about,bought_on,price,ebook')
    simple_report.addQuerySet(testobj,REPORT_HORZ,formatter, filter)

    response = HttpResponse(simple_report.writeReport(),mimetype='application/ms-excel')
    response['Content-Disposition'] = 'attachment; filename=simple_test.xls'
    return response
6
répondu brianray 2013-01-29 05:44:48

Vous pouvez enregistrer votre fichier XLS en StringIO objet, qui ressemble à un fichier.

Vous pouvez retourner L'objet StringIO getvalue() dans la réponse. Assurez-vous d'ajouter des en-têtes de le marquer comme une feuille.

2
répondu S.Lott 2009-05-19 19:17:54

Vous pourriez vouloir vérifier huDjango qui vient d'une fonction appelée serializers.queryset_to_xls() convertissez un queryset en une feuille Excel téléchargeable.

2
répondu max 2009-09-01 13:56:18
1
répondu satels 2011-10-06 13:36:50

si votre résultat de données n'a pas besoin de formules ou de styles de présentation exacts, Vous pouvez toujours utiliser CSV. tout programme de tableur le lirait directement. J'ai même vu des webapps qui génèrent du CSV mais le nom sous lequel .XSL juste pour être sûr que Excel l'ouvre

0
répondu Javier 2009-05-19 15:15:40