在django中将openpyxl工作簿对象返回为HttpResponse。 可能吗?
我需要从django的数据库提供一个excel格式的数据给访问者。
我能想到的唯一方法就是这些步骤:
- 从数据库中提取数据。
- 用来自
openpyxl
Workbook
对象包装它。 - 暂时保存在某个地方。
- 再读一遍“rb”。
- 用excel的mimetypes返回视图。
- 删除磁盘上的excel文件。 (现在没用了吧?)
这应该做到这一点。 但是,我认为还有另一种更好的方法来做到这一点。 我的意思是也许有一种方法可以直接返回openpyxl
对象作为HttpResponse
没有中间文件中。
所以,我的问题是:是否有可能返回openpyxl
的Worbook
对象? (我是新的openpyxl
)
您实际上并不需要将数据保存在磁盘上的任何位置; openpyxl有办法做到这一点,虽然它没有很好的文件。 很久以前,我使用xlwt创build了类似的东西 ,但是我最近也使用了openpyxl在Falcon框架中构build了类似的东西。
把这两者放在一起,你的代码会看起来像是:
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
如果你正在生成更大的文件,我会build议看看使用StreamingHttpResponse,但我相信这至less会让你去。
这只是一个基于两个项目合并而成的现成片段,因此可能不完全正确。 它应该是非常接近,虽然。 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
库! 现在可以在这里find: https : //github.com/tarkatronic/django-excel-response
你可以用pip install django-excel-response
来安装它,并且开始使用它作为Django的HttpResponse
的替代品! 包含最less的文档,欢迎提供改进/build议。 🙂