Django:openpyxl保存工作簿作为附件

Sil*_*est 21 python django excel xlsx openpyxl

Hi I have a quick question. I didn't find answer in internet maybe someone of you can help me.

So i want to save workbook as attachment but I don't know how lets see an example :

    from openpyxl import Workbook
    from openpyxl.cell import get_column_letter
    wb = Workbook(encoding='utf-8')
    dest_filename = 'file.xlsx'
    ws = wb.worksheets[0]
    ws.title = "range names"
    for col_idx in xrange(1, 40):
        col = get_column_letter(col_idx)
        for row in xrange(1, 600):
            ws.cell('%s%s'%(col, row)).value = '%s%s' % (col, row)
    ws = wb.create_sheet()
    ws.title = 'Pi'
    ws.cell('F5').value = 3.14
Run Code Online (Sandbox Code Playgroud)

Then I tried :

response = HttpResponse(wb, content_type='application/vnd.ms-excel')
response['Content-Disposition'] = 'attachment; filename="foo.xls"'
return response
Run Code Online (Sandbox Code Playgroud)

It's returning xlsx file indeed but in file there is only object adres not the content of file:

<openpyxl.workbook.Workbook object at 0x00000000042806D8>
Run Code Online (Sandbox Code Playgroud)

Can someone help ?

ale*_*cxe 32

试试看:

from openpyxl.writer.excel import save_virtual_workbook
...
response = HttpResponse(save_virtual_workbook(wb), content_type='application/vnd.ms-excel')
Run Code Online (Sandbox Code Playgroud)

save_virtual_workbook是专为您的用例而设计的.这是一个文档字符串:

msgstr"""返回内存中的工作簿,适合Django响应.""

  • 你好!此提交已从 openpyxl 中弃用:https://bitbucket.org/openpyxl/openpyxl/commits/2c8045bc3abf6a637f9f93400d8e0f603506a133。寻找片段以使用 NamedTemporaryFile 代替:) (2认同)

mel*_*ath 5

至少在某些版本的 django/python/openpyxl 上,给定的解决方案不起作用。请参阅https://bitbucket.org/openpyxl/openpyxl/issues/657/save_virtual_workbook-generates-junk-data

简单的工作解决方案:

wb = Workbook(write_only=True, encoding='utf-8')
ws = wb.create_sheet()
for row in data:
    ws.append([str(cell) for cell in row])
response = HttpResponse(content_type='application/vnd.ms-excel')
wb.save(response)
Run Code Online (Sandbox Code Playgroud)

这里发生的是 Django 的 HttpResponse 是一个类似文件的对象。Workbook.save()可以采用类似文件的对象。(在内部,它使用zipfile,它采用文件名或类似文件的对象。)

如果您要操作内存中的文件,这是最简单且可能最有效的解决方案。流式响应实际上没有意义,因为数据不是使用生成器创建的。即使 save_virtual_workbook 工作,它写入的数据在可读之前也会生成为块。

另一种选择是创建一个 NamedTemporaryFile (从临时文件或 Django 的包装器),将其传递到Workbook.save(),然后使用FileResponse从文件系统而不是从内存中传输它。