我需要从django的数据库向访问者提供excel格式的数据。
我唯一能想到的方法就是通过这些步骤:
Workbook对象从openpyxl包装它。这样就行了。但是,我认为还有更好的方法。我的意思是,也许有一种方法可以直接将openpyxl对象作为HttpResponse返回,而不需要中间文件介质。
所以,我这里的问题是:返回openpyxl的Worbook对象可以吗?(我是openpyxl的新手)
发布于 2015-10-19 16:20:19
实际上,您不需要将数据保存在磁盘上的任何地方;openpyxl有一种方法可以做到这一点,尽管它没有很好的文档。很久以前,我使用xlwt创建了像这样的东西,但最近我也使用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,但我相信这至少会让您开始使用。
这只是一个即兴片段,基于我所做的两个项目的合并,所以它可能不是完全正确的。不过应该很近。“猎鹰”的输出类似于:
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的替代!所包含的文档很少,欢迎改进/建议。:)
发布于 2020-07-19 03:45:33
由于save_virtual_workbook将过时,所以我使用了流。
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发布于 2019-10-21 21:30:50
这对我来说很管用
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 responsehttps://stackoverflow.com/questions/33217306
复制相似问题