35

在 django 站点上,我想根据数据库中的一些数据生成一个 excel 文件。

我正在考虑使用xlwt,但它只有一种将数据保存到文件的方法。如何才能将文件获取到 HttpResponse 对象?或者你知道更好的图书馆吗?

我也找到了这个片段,但它不能满足我的需要。我想要的只是一种将流从 xlwt 对象获取到响应对象的方法(无需写入临时文件)

4

6 回答 6

56

整洁的包装!我不知道这个

根据文档,该save(filename_or_stream)方法采用要保存的文件名或要写入的类似文件的流。

一个 Django 响应对象恰好是一个类似文件的流!就这样吧xls.save(response)查看有关使用 ReportLab生成 PDF的 Django 文档以查看类似情况。

编辑:(改编自 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')
于 2009-05-19T15:09:44.250 回答
6

***更新: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
于 2010-01-28T06:05:15.223 回答
2

您可以将 XLS 文件保存到类似于文件的StringIO对象。

您可以在响应中返回 StringIO 对象getvalue()。请务必添加标题以将其标记为可下载的电子表格。

于 2009-05-19T19:17:54.917 回答
2

您可能想检查huDjango,它带有一个名为serializers.queryset_to_xls()do convert a queryset into an可下载的 Excel Sheet 的函数。

于 2009-09-01T13:56:18.617 回答
1

使用https://bitbucket.org/kmike/django-excel-response

于 2011-10-06T13:36:50.723 回答
0

如果您的数据结果不需要公式或精确的表示样式,您可以随时使用 CSV。任何电子表格程序都会直接读取它。我什至见过一些生成 CSV 但将其命名为 .XSL 的 Web 应用程序,以确保 Excel 会打开它

于 2009-05-19T15:15:40.337 回答