Проблема с передачей/приемом файла Excel из бэкенда (django_v1.9.11) во фронтенд (angularjs)

На передней панели есть таблица и кнопка для экспорта в Excel. При нажатии на нее необходимо отправить ajax на бэкэнд, сгенерировать файл Excel и передать его на фронтэнд, чтобы загрузить через браузер на диск.

Бэкенд (django v1.9.11)

from openpyxl import Workbook
from django.http import HttpResponse


def send_xl(self, request):
      
    wb = Workbook()
    sheet = wb.active
    
    # this is test data. real data is hidden
    sheet['A1'] = 'Hello world!'
    sheet['B1'] = 'Excel with Django.'

    response = HttpResponse(content_type='application/vnd.openxmlformats- officedocument.spreadsheetml.sheet')
    response['Content-Disposition'] = 'attachment; filename=my_excel_file.xlsx'
    wb.save(response)

    return response

Элемент HTML

<button ng-click="downloadExcel()">
    Export
</button>

Фронтенд (angularjs)

$scope.downloadExcel = function(){
    $.get("", {action:"send_xl", col: $scope.col, sortDirection: $scope.sortDirection }).
    then(function (response){
    let blob = new Blob([response], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
    let url = URL.createObjectURL(blob);
    let a = document.createElement('a');
    document.body.appendChild(a);
    a.href = url;
    a.download = 'filename.xlsx';
    a.click();
    window.URL.revokeObjectURL(url);
}

Я ожидаю, что при нажатии на кнопку браузер загрузит файл, который можно открыть через Excel. Файл загружается, но Excel выдает ошибку:

(я открываю его через LibreOffice) "Файл 'filename.xlsx' поврежден и поэтому не может быть открыт. LibreOffice может попытаться восстановить файл.

Повреждение может быть результатом манипуляций с документом или структурного повреждения документа при передаче данных.

Мы рекомендуем не доверять содержимому восстановленного документа. Выполнение макросов для этого документа отключено.

Должен ли LibreOffice восстановить файл?"

Скажите, что я делаю не так. Что я не понимаю? Заранее спасибо за ответ

Вернуться на верх