Загрузка файла Excel xlsx в Angularjs и WebApi


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

Ниже приведен код серверной части.

var output = await reportObj.GetExcelData(rParams);
    if (output != null){
        var result = new HttpResponseMessage(HttpStatusCode.OK)
        {
            Content = new ByteArrayContent(output.ConentBytes)
        };
        result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
        {
            FileName = output.FileName
        };
 return result;
 }


Вот код для клиентской стороны:

        var saveData = function (response) {

        if (response.status === 200) {
            var reportData = response.data;

            var b = new Blob([reportData], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" });
            saveAs(b,"ReportFile.xlsx");//this is FileSaver.js function
        } else {
            console.log(response.statusText);
        }

    };


    $scope.getExcelFile = function(reportName, reportParams) {

        reportDataService.getExcelReportData(reportName, reportParams, saveData);

    }


Ниже приведено сообщение об ошибке:
Excel не смог открыть newFile.xlsx, потому что некоторый контент не читается. Вы хотите открыть и отремонтировать эту книгу?

При нажатии на восстановление появляется следующая ошибка: Excel не может открыть этот файл.
Недопустимый формат файла или расширение файла. Убедитесь, что файл не был поврежден и расширение файла соответствует формату файла.

Может ли кто-нибудь объяснить мне, что я делаю неправильно? Между тем, те же объекты генератора файлов на стороне сервера работают плавно в приложении форм ASP.Net, и файл открывается без какой-либо ошибки.
Спасибо.

Ответ 1

Я ожидаю, что ваш вызов $http не получит конфигурацию типа ответа. Так я загружаю офисные файлы:

function download(url, defaultFileName) {
    var self = this;
    var deferred = $q.defer();
    $http.get(url, { responseType: "arraybuffer" }).then(
        function (data, status, headers) {
            var type = headers('Content-Type');
            var disposition = headers('Content-Disposition');
            if (disposition) {
                var match = disposition.match(/.*filename=\"?([^;\"]+)\"?.*/);
                if (match[1])
                    defaultFileName = match[1];
            }
            defaultFileName = defaultFileName.replace(/[<>:"\/\\|?*]+/g, '_');
            var blob = new Blob([data], { type: type });
            saveAs(blob, defaultFileName);
            deferred.resolve(defaultFileName);                    
        }, function (data, status) {
            var e = /* error */
            deferred.reject(e);
        });
    return deferred.promise;
}

Ответ 2

Вам просто нужно сделать только одно. включить js для сохранения файла локально. Загрузите его из " https://github.com/eligrey/FileSaver.js/" ваши данные ответа должны быть в виде blob.

Я реализовал его и его работу.

function downloadfile(url,defaultFileName){
  var self = this;
    var deferred = $q.defer();
    $http.get(url, { responseType: "blob" }).then(
       function (data){
          saveAs(data.data, defaultFileName)
          deferred.resolve(defaultFileName);                    
        }, function (data) {
           var e = /* error */
            deferred.reject(e);
        });
        return deferred.promise;
}

Ответ 3

Я столкнулся с аналогичной проблемой при написании excel с использованием библиотеки Javascript Excel Builder. В конце я обнаружил, что причина в том, что контрольный символ '\ u001a' был включен в данные.

Решение кодирует элемент управления char в формате Excel как "_x001a_".

То, как я поставил диагноз, было следующим:

.xlsx файл - это всего лишь zipped файл. Вы можете открыть его с помощью 7-zip. Внутри папки xl/ находится файл sharedString.xml, содержащий все строки. Извлеките файл и откройте его с помощью Notepad ++. Если вы видите какой-либо управляющий символ, это может быть причиной.