Загрузка файла 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 ++. Если вы видите какой-либо управляющий символ, это может быть причиной.