您实际上不需要将数据保存在磁盘上的任何位置; openpyxl 有一种方法可以做到这一点,尽管它没有很好的文档记录。很久以前,我使用 xlwt 创建了 something like this,但我最近也在 Falcon 框架中使用 openpyxl 构建了类似的东西。
将这两者放在一起,您的代码看起来类似于:
from django.http import HttpResponse
from openpyxl import Workbook
from openpyxl.writer.excel import save_virtual_workbook
workbook = Workbook()
worksheet = workbook.active
# ... worksheet.append(...) all of your data ...
response = HttpResponse(content=save_virtual_workbook(workbook), mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
response['Content-Disposition'] = 'attachment; filename=myexport.xlsx'
return response
如果您要生成较大的文件,我建议您考虑使用 StreamingHttpResponse,但我相信这至少可以帮助您。
这只是一个现成的 sn-p,它基于我参与的两个项目的合并,所以它可能并不完全正确。不过应该很接近了。 Falcon 中的输出如下所示:
response.content_type = 'application/octet-stream;'
response.set_header('Content-Disposition', 'attachment; filename=myexport.xlsx')
response.body = save_virtual_workbook(workbook)
更新:
现在这更容易了,因为我使用 openpyxl 完全重写了我的旧 django-excel-response 库!现在可以在这里找到它:https://github.com/tarkatronic/django-excel-response
您可以使用pip install django-excel-response 安装它,并开始使用它作为Django 的HttpResponse 的替代品!包含的文档很少,欢迎提出改进/建议。 :)