无法通过Django视图打开作为附件返回的XLS

时间:2012-02-14 05:21:11

标签: django excel http mime-types

我正在使用xlwt生成一个Excel文件,我在Django视图的HttpResponse中作为附件返回。

from django.http import HttpResponse

def my_view(request):
    ...
    workbook = xlwt.Workbook(encoding='utf-8')
    #write my workbook data here
    workbook.save(#absolute_path_here)

    response = HttpResponse(mimetype='application/vnd.ms-excel')
    response['Content-Disposition'] = 'attachment; filename=worksheet.xls'
    return response

文件保存到我指定的路径,我可以从磁盘正确打开文件并且数据存在。但是,当我尝试使用Excel从文件下载提示打开文件时,我受到了欢迎:

enter image description here

[字幕] 您尝试打开'worksheet.xls'的文件格式与文件扩展名指定的格式不同。在打开文件之前,请验证文件是否已损坏且是否来自受信任的源。你想现在打开文件吗?

并且Excel文件没有数据。我做错了什么?

2 个答案:

答案 0 :(得分:3)

django HttpResponse是一个类似文件的对象(它提供了write,flush ...方法,请参阅the docs)。因此,您可以将其直接传递给工作簿的save方法。

import xlwt
wb = xlwt.Workbook()
...
...
response = HttpResponse(mimetype='application/vnd.ms-excel')
response['Content-Disposition'] = 'attachment; filename=your-file.xls'
wb.save(response)
return response

答案 1 :(得分:0)

您需要将文件的内容传递给HttpResponse,否则您将发送空响应(无数据);这就是你得到那个错误的原因。

import xlwt
wb = xlwt.Workbook()
# your code
content = StringIO.StringIO()
wb.save(content) # "File" is written
response = HttpResponse(content.getvalue(),
                        mimetype='application/vnd.ms-excel; charset=utf-8')
response['Content-Disposition'] = 'attachment; filename=worksheet.xls'
return response

此外,将字符集与mime类型一起传递总是好的。