2012-02-14 47 views
2

我使用xlwt來生成Excel文件,我在Django視圖中以HttpResponse中的附件形式返回。無法打開通過Django視圖作爲附件返回的XLS

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 

的文件保存到我指定的路徑,我可以從磁盤正確打開文件和數據存在。

enter image description here

[標題] 你試圖打開「worksheet.xls」的文件,方法是:然而,當我嘗試打開使用Excel從文件下載提示的文件,我與打招呼採用不同於文件擴展名指定的格式。在打開文件之前,驗證該文件是否已損壞並且來自受信任的來源。你想現在打開文件嗎?

而Excel文件沒有數據。我究竟做錯了什麼?

+0

嗨。使用mimetype ='application/xls'對我來說工作得很好。 – 2012-02-14 06:29:54

回答

3

django HttpResponse是一個文件類對象(它提供了寫入,刷新...方法,參見the docs)。因此,您可以直接將其傳遞給工作簿的保存方法。

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 
+0

完美地工作。我沒有想過要將回復作爲工作簿的內容來編寫。謝謝! – Brandon 2012-02-14 13:56:11

+0

:)我已經編輯了一個小解釋的答案。 – luc 2012-02-15 06:44:03

+0

令人敬畏。我絕對主演這個帖子! – Brandon 2012-02-16 01:51:29

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類型一起傳遞總是好的。

相關問題