Django:openpyxl将工作簿保存为附件
嗨,我有一个快速的问题。 我在网上找不到答案,也许有人可以帮助我。
所以我想保存工作簿作为附件,但我不知道如何让看到一个例子:
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
然后我试着:
response = HttpResponse(wb, content_type='application/vnd.ms-excel') response['Content-Disposition'] = 'attachment; filename="foo.xls"' return response
它确实返回xlsx文件,但在文件中只有对象adres而不是文件的内容:
<openpyxl.workbook.Workbook object at 0x00000000042806D8>
有人可以帮忙吗?
试一试:
from openpyxl.writer.excel import save_virtual_workbook ... response = HttpResponse(save_virtual_workbook(wb), content_type='application/vnd.ms-excel')
save_virtual_workbook
是专门为您的用例devise的。 这是一个文档string:
“”“返回一个内存中的工作簿,适合Django响应。”“”
我通常使用
ws = wb.add_sheet("Pi")
代替
ws = wb.create_sheet() ws.title = "Pi"
而且,你可以尝试做:(看文档 )
wb.save(stream)
然后在HttpResponse中使用stream。
至less在某些版本的django / python / openpyxl中,给定的解决scheme不起作用。 请参阅https://bitbucket.org/openpyxl/openpyxl/issues/657/save_virtual_workbook-generates-junk-data
简单的工作scheme:
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)
这里发生的事情是,Django的HttpResponse是一个文件类对象。 Workbook.save()
可以采取类似文件的对象。 (在内部,它使用zipfile ,它可以使用文件名或类似文件的对象。)
如果你在内存中操作文件,这是最简单也可能是最有效的解决scheme。 由于数据不是用发生器创build的,因此stream式响应没有意义。 即使save_virtual_workbook正常工作,它所写入的数据在其可读之前也会以块forms生成。
另一个选项是创build一个NamedTemporaryFile(从tempfile或Django的包装器),将其传递到Workbook.save()
,然后使用FileResponse从文件系统而不是从内存中传输。