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)
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')
* * * 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
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