【问题标题】:Return openpyxl workbook object as HttpResponse in django. Is it possible?在 django 中将 openpyxl 工作簿对象作为 HttpResponse 返回。可能吗?
【发布时间】:2016-01-17 23:17:48
【问题描述】:

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

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

  1. 从数据库中提取数据。
  2. 用来自openpyxlWorkbook 对象包装它。
  3. 暂时保存它。
  4. 再读一遍“rb”。
  5. 返回查看excel's mime type
  6. 删除磁盘上的 excel 文件。 (现在没用了吧?)

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

所以,我的问题是:是否可以返回 openpyxlWorbook 目的? (我是openpyxl 的新手)

【问题讨论】:

    标签: python django excel


    【解决方案1】:

    由于 save_virtual_workbook 将过时,我使用了stream insted。

    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】:

      这对我有用

      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
      

      【讨论】:

        【解决方案3】:

        您实际上不需要将数据保存在磁盘上的任何位置; openpyxl 有一种方法可以做到这一点,尽管它没有很好的文档记录。很久以前,我使用 xlwt 创建了 something like this,但我最近也在 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,但我相信这至少可以帮助您。

        这只是一个现成的 sn-p,它基于我参与的两个项目的合并,所以它可能并不完全正确。不过应该很接近了。 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 的替代品!包含的文档很少,欢迎提出改进/建议。 :)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-13
          • 2021-10-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多