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

标签 python django excel

我需要向访问者提供来自 django 数据库的 excel 格式的数据。

我能想到的唯一方法是执行以下步骤:

  1. 从数据库中提取数据。
  2. openpyxl 中的 Workbook 对象包装它。
  3. 暂时保存在某个地方。
  4. 再读一次'rb'。
  5. 返回 View excel's mime type .
  6. 删除磁盘上的 excel 文件。 (现在没用了吧?)

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

所以,我的问题是:是否可以返回 openpyxlWorbook 目的? (我是 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/

相关文章:

c# - 有没有理由不将 "1"类与小型 VSTO 加载项一起使用?

vba - 与访问用户定义类型的字段相比,VBA 类模块属性是否较慢?

c# - 动态获取第一个 Excel 工作表的名称并将其影响到变量

python - sqlite中的变量表名

python - Django:使用 'can_order' 更改 FormSet 中表单的顺序

python - 在 python 中约束随机游走,如何让它工作?

css - Django 中的 GUI CSS 选择器

python - Django 模板图片无法加载

python - 下载以特殊字符命名的在线 PDF 文件

python - 如何使用 Django 中的设置