2009-05-19 16 views
31

Sur un site django, je souhaite générer un fichier Excel basé sur certaines données de la base de données.django excel xlwt

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

J'ai également trouvé ce snippet 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 de réponse (sans écrire dans un fichier temporaire)

Répondre

50

package soigné! Je ne le savais pas

Selon le document, la méthode save(filename_or_stream) prend soit un nom de fichier sur lequel enregistrer, soit un flux de type fichier à écrire.

Et un objet de réponse Django se trouve être un flux de type fichier! alors faites juste xls.save(response). Regardez les documents Django sur generating PDFs avec ReportLab pour voir une situation similaire.

modifier: (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 vue, il suffit de créer l'objet xls et finir avec

return xls_to_response(xls,'foo.xls') 
+0

merci, je pensais que ce devrait être quelque chose comme ça, je ne savais pas où chercher. Je vais essayer –

+5

Cela fonctionne très bien, mais pas jusqu'à ce que vous compreniez la syntaxe. L'astuce consiste à créer un objet HttpResponse et à y enregistrer le classeur xlwt. Exemple: xls_response = HttpResponse (mimetype = "application/ms-excel") xls_response ['Content-Disposition'] = 'pièce jointe; filename = foo.xls ' xls.save (xls_response) return xls_response – ShawnMilo

+0

Merci mon cher, vous avez vraiment résolu mon problème. Beaucoup apprécié votre aide! –

0

Si vos données résultat n » t besoin de formules ou de styles de présentation précis, vous pouvez toujours utiliser CSV. n'importe quel tableur le lirait directement. J'ai même vu quelques webapps qui génèrent du CSV mais le nomme comme .XSL juste pour être sûr qu'Excel l'ouvre

+0

J'ai aussi lu quelque part que vous pouvez retourner un fichier html qu'excel peut lire, mais je veux utiliser des formules et des styles, donc ce n'est pas bon. –

2

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

Vous pouvez renvoyer l'objet getvalue() de l'objet StringIO dans la réponse. Veillez à ajouter des en-têtes pour le marquer comme une feuille de calcul téléchargeable.

2

Vous voudrez peut-être vérifier huDjango qui vient avec une fonction appelée serializers.queryset_to_xls() convertir un jeu de requête en une feuille Excel téléchargeable.

6

*** MISE À JOUR: django-Excel-modèles ne sont maintenus plus longtemps, essayez de la place Marmir http://brianray.github.com/mm/

Toujours dans le développement que je tape ceci, mais http://code.google.com/p/django-excel-templates/ Django Excel projet modèles vise à faire ce que votre demande.

Voir 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