django excel xlwt - PullRequest
       7

django excel xlwt

33 голосов
/ 19 мая 2009

На сайте django я хочу создать файл excel на основе некоторых данных в базе данных.

Я думаю об использовании xlwt , но у него есть только способ сохранить данные в файл. Как получить файл в объект HttpResponse? Или, может быть, вы знаете лучшую библиотеку?

Я также нашел этот фрагмент , но он не делает то, что мне нужно. Все, что я хочу, - это способ получить поток от объекта xlwt к объекту ответа (без записи во временный файл)

Ответы [ 6 ]

54 голосов
/ 19 мая 2009

аккуратный пакет! я не знал об этом

Согласно документу, метод save(filename_or_stream) принимает либо имя файла для сохранения, либо файлоподобный поток для записи.

И объект ответа Django оказывается потоком, похожим на файл! просто сделай xls.save(response). Посмотрите документы Django о создании PDF-файлов с ReportLab, чтобы увидеть похожую ситуацию.

редактировать: (адаптировано из комментария 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

затем, из вашей функции просмотра, просто создайте объект xls и закончите с

return xls_to_response(xls,'foo.xls')
6 голосов
/ 28 января 2010

*** ОБНОВЛЕНИЕ: django-excel-templates больше не поддерживаются, вместо этого попробуйте Marmir http://brianray.github.com/mm/

Пока я набираю текст, он все еще находится в разработке, но http://code.google.com/p/django-excel-templates/ Проект шаблонов Django Excel направлен на то, чтобы выполнить то, что вы просите.

Специально посмотрите на тесты. Вот простой случай:

#
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
2 голосов
/ 01 сентября 2009

Возможно, вы захотите проверить huDjango , который поставляется с функцией под названием serializers.queryset_to_xls(), которая конвертирует набор запросов в загружаемый лист Excel.

2 голосов
/ 19 мая 2009

Вы можете сохранить свой XLS-файл в объекте StringIO , который подобен файлу.

Вы можете вернуть getvalue() объекта StringIO в ответе. Обязательно добавьте заголовки, чтобы пометить его как загружаемую электронную таблицу.

1 голос
/ 06 октября 2011
0 голосов
/ 19 мая 2009

Если результат ваших данных не нуждается в формулах или точных стилях представления, вы всегда можете использовать CSV. любая программа для работы с электронными таблицами будет читать ее напрямую. Я даже видел некоторые веб-приложения, которые генерируют CSV, но назовите его как .XSL, просто чтобы убедиться, что Excel открывает его

...