我需要从django的数据库向访问者提供excel格式的数据。
我能想到的唯一方法就是采取以下措施:
v8
中的Workbook
对象包裹它。应该这样做。但是,我认为还有另一种更好的方法。我的意思是
也许有一种方法可以直接将openpyxl
对象作为openpyxl
返回
没有中间文件介质。
所以,我的问题是:是否可以返回HttpResponse
' s openpyxl
宾语? (我是Worbook
)
答案 0 :(得分:19)
您实际上不需要将数据保存在磁盘上的任何位置; openpyxl有办法做到这一点,虽然它没有很好的记录。很久以前,我使用xlwt创建了something like this,但最近我还使用openpyxl在Falcon框架中构建了类似的东西。
将这两者放在一起,您的代码将看起来像:
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
的替代品!包含的文档很少,欢迎提出改进/建议。 :)
答案 1 :(得分:3)
由于save_virtual_workbook已过时,因此我使用了stream安装。
from openpyxl import Workbook
from tempfile import NamedTemporaryFile
def exportToExcel(request):
workbook = Workbook()
...
with NamedTemporaryFile() as tmp:
workbook.save(tmp.name)
tmp.seek(0)
stream = tmp.read()
response = HttpResponse(content=stream, content_type='application/ms-excel', )
response['Content-Disposition'] = f'attachment; filename=ExportedExcel-{datetime.now().strftime("%Y%m%d%H%M")}.xlsx'
return response
答案 2 :(得分:0)
这对我有用
from openpyxl import Workbook, load_workbook
from openpyxl.writer.excel import save_virtual_workbook
wb = Workbook()
...
response = HttpResponse(content=save_virtual_workbook(wb), content_type='application/ms-excel')
response['Content-Disposition'] = 'attachment; filename=Inform.xlsx'
return response