在Angularjs和WebApi中下载Excel文件xlsx
我正在做一个任务,在这个任务中,我必须以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无法打开此文件。
文件格式或文件扩展名无效。 validation该文件是否已损坏,文件扩展名是否与该文件的格式匹配。
有人能指导我做错了什么吗? 同时,同一个服务器端文件生成器对象在ASP.Net表格应用程序中运行平稳,文件打开时也没有任何错误。
谢谢。
我希望你的$http
调用缺less响应typesconfiguration。 这是我下载office文件的方式:
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; }
你只需要做一件事。 包括下面的js在本地保存文件。 从“ https://github.com/eligrey/FileSaver.js/ ”下载它,你的响应数据应该是blobtypes的。
我已经实施了它的工作。
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; }
使用Javascript库Excel Builder编写excel时遇到了类似的问题。 最后,我发现原因是控制字符“\ u001a”被包含在数据中。
解决方法是以Excel的方式将控制字符编码为'_x001a_'。
我诊断问题的方式是这样的:
.xlsx文件只是一个压缩的XML文件。 你可以用7-zip打开它。 在xl/
文件夹里有一个包含所有string的文件sharedString.xml
。 提取文件并用Notepad ++打开它。 如果你看到任何控制angular色,那么这可能是原因。