Не удалось открыть XLS, возвращенный как вложение через представление Django - PullRequest
2 голосов
/ 14 февраля 2012

Я использую xlwt для создания файла Excel, который я возвращаю в качестве вложения в HttpResponse в представлении Django.

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

[заголовок] Файл, который вы пытаетесь открыть, «рабочий лист».xls ', в другом формате, чем указано в расширении файла.Перед открытием файла убедитесь, что файл не поврежден и поступил из надежного источника.Хотите открыть файл сейчас?

, а в файле Excel нет данных.Что я делаю не так?

Ответы [ 2 ]

3 голосов
/ 14 февраля 2012

Django HttpResponse - это файловый объект (он предоставляет методы write, flush ..., см. 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 голосов
/ 14 февраля 2012

Вам необходимо передать содержимое файла на 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.

...