2009-05-19 19 views
31

En un sitio de django, quiero generar un archivo de Excel basado en algunos datos en la base de datos.django excel xlwt

Estoy pensando en usar xlwt, pero solo tiene un método para guardar los datos en un archivo. ¿Cómo se puede obtener el archivo al objeto HttpResponse? ¿O tal vez conoces una mejor biblioteca? También encontré este snippet pero no hace lo que necesito. Todo lo que quiero es una forma de obtener la transmisión del objeto xlwt al objeto de respuesta (sin escribir en un archivo temporal)

Respuesta

50

paquete limpio! no sabía sobre esto

De acuerdo con el documento, el método save(filename_or_stream) toma un nombre de archivo para guardar, o una secuencia de archivos para escribir.

¡Y un objeto de respuesta Django pasa a ser una secuencia de archivos! así que solo haz xls.save(response). Mire los documentos de Django sobre generating PDFs con ReportLab para ver una situación similar.

edición: (adaptación del comentario 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 

entonces, desde su función de vista, basta con crear el objeto xls y terminar con

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

gracias, pensé que debería ser algo como esto, yo no sabía dónde buscar. Lo probaré –

+5

Esto funciona muy bien, pero no hasta que descubras la sintaxis. El truco es crear un objeto HttpResponse y guardar el libro de trabajo xlwt en él. Ejemplo: xls_response = HttpResponse (mimetype = "application/ms-excel") xls_response ['Content-Disposition'] = 'archivo adjunto; nombre de archivo = foo.xls ' xls.save (xls_response) return xls_response – ShawnMilo

+0

Gracias amigo, realmente resolvió mi problema. ¡Aprecié mucho tu ayuda! –

0

Si los datos resultan doesn' Si necesita fórmulas o estilos de presentación exactos, siempre puede usar CSV. cualquier programa de hoja de cálculo lo leería directamente. Incluso he visto algunos webapps que generan CSV, pero nómbrelo como .XSL solo para asegurarse de que Excel lo abre

+0

También he leído en alguna parte que puede devolver un archivo html que excel puede leer, pero quiero usar fórmulas y estilos, así que eso no es bueno. –

2

Puede guardar su archivo XLS en un objeto StringIO, que es como un archivo.

Puede devolver el objeto StringIO's getvalue() en la respuesta. Asegúrese de agregar encabezados para marcarlo como una hoja de cálculo descargable.

2

Es posible que desee comprobar huDjango que viene con una función llamada serializers.queryset_to_xls() convertir un conjunto de preguntas en una hoja de Excel descargable.

6

*** ACTUALIZACIÓN: django-excel-plantillas ya no se mantienen, en lugar de tratar MarMir http://brianray.github.com/mm/

Aún en desarrollo mientras escribo esto, pero http://code.google.com/p/django-excel-templates/ proyecto de plantillas de Django Excel pretende hacer lo que su venta.

Mire específicamente las pruebas. Este es un caso 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 
Cuestiones relacionadas