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从文件系统而不是从内存中传输。