Django excel xlwt
На сайте django я хочу сгенерировать файл excel на основе некоторых данных в базе данных.
Я думаю использовать xlwt, но у него есть только способ сохранить данные в файле. Как получить файл к объекту HttpResponse? Или, может быть, вы знаете лучшую библиотеку?
Я также нашел этот snippet, но он не делает то, что мне нужно. Все, что я хочу, это способ получить поток от объекта xlwt к объекту ответа (без записи во временный файл).
Ответы
Ответ 1
аккуратный пакет! я не знал об этом
В соответствии с документом метод 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')
Ответ 2
*** UPDATE: django-excel-templates больше не поддерживаются, вместо этого попробуйте Marmir http://brianray.github.com/mm/
Все еще в разработке, поскольку я печатаю это, но http://code.google.com/p/django-excel-templates/ Проект Django excel templates нацелен на то, что вы просите.
В частности, посмотрите на тесты. Вот простой случай:
#
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
Ответ 3
Вы можете сохранить свой файл XLS в StringIO, который является файловым.
Вы можете вернуть объект StringIO getvalue()
в ответ. Обязательно добавьте заголовки, чтобы отметить его как загружаемую таблицу.
Ответ 4
Возможно, вы захотите проверить huDjango, который приходит с функцией serializers.queryset_to_xls()
, чтобы преобразовать запрос в загружаемый лист Excel.
Ответ 5
Используйте https://bitbucket.org/kmike/django-excel-response
Ответ 6
Если вашему результату данных не нужны формулы или точные стили презентации, вы всегда можете использовать CSV. любая программа электронных таблиц непосредственно прочитала бы ее. Я даже видел некоторые webapps, которые генерируют CSV, но назовите его как .XSL, чтобы убедиться, что Excel открывает его