django excel 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')