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响应.""
至少在某些版本的 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从文件系统而不是从内存中传输它。
| 归档时间: |
|
| 查看次数: |
8435 次 |
| 最近记录: |