Return openpyxl workbook object as HttpResponse in django. Is it possible?

Mas*_*gol 14 python django excel

I need to provide an excel formatted data from django's database to visitors.

The only way I can think of is with these steps:

  1. Extract data from database.
  2. Wrap it with Workbook object from openpyxl.
  3. Save it somewhere temporarily.
  4. Read it again as 'rb'.
  5. 使用excel的mime类型返回视图.
  6. 删除磁盘上的excel文件.(现在没用了?)

应该这样做.但是,我认为还有另一种更好的方法.我的意思是也许有一种方法可以openpyxlHttpResponse没有中间文件介质的情况下直接返回对象.

所以,在这里我的问题是:是否有可能返回openpyxlWorbook 对象?(我是新手openpyxl)

Joe*_*elm 21

您实际上不需要将数据保存在磁盘上的任何位置; openpyxl有办法做到这一点,虽然它没有很好的记录.很久以前,我使用xlwt 创建了这样的东西,但最近我还使用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
Run Code Online (Sandbox Code Playgroud)

如果你要生成更大的文件,我建议你考虑使用StreamingHttpResponse,但我相信这至少可以帮助你.

这只是一个基于我工作的两个项目合并的袖口片段,所以它可能不完全正确.它应该非常接近.Falcon的输出看起来像:

response.content_type = 'application/octet-stream;'
response.set_header('Content-Disposition', 'attachment; filename=myexport.xlsx')
response.body = save_virtual_workbook(workbook)
Run Code Online (Sandbox Code Playgroud)

更新: 现在这更容易,因为我django-excel-response使用openpyxl 完全重写了我的旧库!现在可以在这里找到:https://github.com/tarkatronic/django-excel-response

您可以安装它pip install django-excel-response,并开始使用它作为Django的替代品HttpResponse!包含的文档很少,欢迎提出改进/建议.:)


Si *_*Thu 6

由于 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
Run Code Online (Sandbox Code Playgroud)


小智 5

这对我有用

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
Run Code Online (Sandbox Code Playgroud)