我需要向访问者提供来自 django 数据库的 excel 格式的数据。
我能想到的唯一方法是执行以下步骤:
- 从数据库中提取数据。
- 用
openpyxl
中的Workbook
对象包装它。 - 暂时保存在某个地方。
- 再读一次'rb'。
- 返回 View excel's mime type .
- 删除磁盘上的 excel 文件。 (现在没用了吧?)
应该可以了。但是,我认为还有另一种更好的方法来做到这一点。我是说
也许有一种方法可以直接将 openpyxl
对象作为 HttpResponse
返回
没有中间文件介质。
所以,我的问题是:是否可以返回 openpyxl
的 Worbook
目的? (我是 openpyxl
的新手)
最佳答案
您实际上不需要将数据保存在磁盘上的任何位置; openpyxl 有办法做到这一点,虽然它没有很好的记录。很久以前,我创建了 something like this使用 xlwt,但我最近也在 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,但我相信这至少能让您顺利进行。
这只是基于我所从事的两个项目的合并的即兴片段,因此它可能不完全正确。不过应该很接近了。 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
的替代品!包含的文档最少,欢迎提出改进/建议。 :)
关于python - 在 django 中将 openpyxl 工作簿对象作为 HttpResponse 返回。可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33217306/