34 votes

django excel xlwt

Sur un site django, je veux générer un fichier excel à partir de certaines données de la base de données.

Je pense utiliser xlwt mais il ne dispose que d'une méthode pour enregistrer les données dans un fichier. Comment récupérer le fichier dans l'objet HttpResponse ? Ou peut-être connaissez-vous une meilleure bibliothèque ?

J'ai aussi trouvé ceci extrait mais il ne fait pas ce dont j'ai besoin. Tout ce que je veux, c'est un moyen de récupérer le flux de l'objet xlwt vers l'objet réponse (sans écrire dans un fichier temporaire).

55voto

Javier Points 33134

Un emballage soigné ! Je ne connaissais pas ce produit.

Selon le document, le save(filename_or_stream) prend soit un nom de fichier à sauvegarder, soit un flux de type fichier à écrire.

Et il se trouve qu'un objet de réponse Django est un flux de type fichier, donc il suffit de faire xls.save(response) . Consultez la documentation de Django sur générer des PDF avec ReportLab pour voir une situation similaire.

éditer : (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 de visualisation, créez simplement le fichier xls et terminer avec

return xls_to_response(xls,'foo.xls')

6voto

brianray Points 471

***UPDATE : django-excel-templates n'est plus maintenu, essayez plutôt Marmir http://brianray.github.com/mm/

Toujours en cours de développement au moment où je tape ces lignes, mais http://code.google.com/p/django-excel-templates/ Le projet Django excel templates vise à faire ce que vous demandez.

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

2voto

S.Lott Points 207588

Vous pouvez enregistrer votre fichier XLS dans un StringIO qui est semblable à un fichier.

Vous pouvez retourner l'objet StringIO getvalue() dans la réponse. Veillez à ajouter des en-têtes pour indiquer qu'il s'agit d'une feuille de calcul téléchargeable.

2voto

mdorseif Points 7473

Vous pouvez vérifier huDjango qui vient avec une fonction appelée serializers.queryset_to_xls() convertit un ensemble de questions en une feuille Excel téléchargeable.

1voto

satels Points 410

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X