在django中将openpyxl工作簿对象返回为HttpResponse。 可能吗?

我需要从django的数据库提供一个excel格式的数据给访问者。

我能想到的唯一方法就是这些步骤:

  1. 从数据库中提取数据。
  2. 用来自openpyxl Workbook对象包装它。
  3. 暂时保存在某个地方。
  4. 再读一遍“rb”。
  5. 用excel的mimetypes返回视图。
  6. 删除磁盘上的excel文件。 (现在没用了吧?)

这应该做到这一点。 但是,我认为还有另一种更好的方法来做到这一点。 我的意思是也许有一种方法可以直接返回openpyxl对象作为HttpResponse没有中间文件中。

所以,我的问题是:是否有可能返回openpyxlWorbook对象? (我是新的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议。 🙂