django excel xlwt

36 投票
6 回答
21754 浏览
提问于 2025-04-15 11:42

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

我在考虑使用xlwt这个库,但它只有一个方法可以把数据保存到文件里。我该怎么把这个文件放到HttpResponse对象里呢?或者你知道有没有更好的库吗?

我还找到这个代码片段,但它并不能满足我的需求。我只想要一种方法,把xlwt对象中的数据流直接传给响应对象(而不是先写到临时文件里)。

6 个回答

2

你可以把你的XLS文件保存到一个叫做StringIO的对象里,这个对象就像一个文件一样。

然后你可以把这个StringIO对象的getvalue()内容放到响应中返回给用户。记得要添加一些头信息,告诉浏览器这是一个可以下载的电子表格。

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
56

这个包真不错!我之前不知道这个。

根据文档,save(filename_or_stream) 这个方法可以接收一个文件名,或者一个像文件一样的流来写入。

而Django的响应对象恰好就是一个像文件一样的流!所以你只需要用 xls.save(response) 就可以了。想了解更多,可以看看Django的文档,关于用ReportLab 生成PDF的部分,那里有类似的情况。

补充:(根据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')

撰写回答