2015-06-30 1 views
12


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

Ниже приведен код серверной части.
Загрузка файла Excel xlsx в Angularjs и WebApi

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, и файл открывается без какой-либо ошибки.
Спасибо.

+0

что вы '$ http' config? добавьте строку запроса. – hansmaad

+0

config.headers.Authorization = "Bearer" + authData.token; Это просто для авторизации. –

ответ

33

Я ожидаю, что ваш звонок $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; 
} 
+0

Спасибо @hansmadd –

+0

Вы экономите мой день, спасибо! – Weibo

+1

Все, что я получаю в настоящее время, это файл Excel с содержимым «(объект)» в его первой ячейке –

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

вы можете ответить на этот http://stackoverflow.com/questions/43894768/how-to-set-the-no-of-column-name-while-export-the-excel-using-angularjs – Vinoth

+0

1 это лучший решение –

+0

изменение типа ответа на blob - это то, что окончательно сработало для меня – gary69

0

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

Решение кодирует символ управления по методу Excel как «_x001a_».

Как я диагностировал проблему было так:

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

Смежные вопросы