在Angularjs和WebApi中下载Excel文件xlsx

Nad*_*ali 13 javascript c# excel asp.net-web-api angularjs


我正在处理一项任务,我必须以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;
 }
Run Code Online (Sandbox Code Playgroud)


以下是客户端的代码:

        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);

    }
Run Code Online (Sandbox Code Playgroud)


以下是错误消息:
Excel无法打开newFile.xlsx,因为某些内容不可读.你想打开并修复这个工作簿吗?

单击修复时,出现以下错误: Excel无法打开此文件.
文件格式或文件扩展名无效.验证文件是否已损坏,以及文件扩展名是否与文件格式匹配.

有人可以指导我做错了吗?同时,相同的服务器端文件生成器对象在ASP.Net表单应用程序中运行顺畅,文件打开时也没有任何错误.
谢谢.

han*_*aad 36

我希望您的$http呼叫缺少响应类型配置.这是我下载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;
}
Run Code Online (Sandbox Code Playgroud)

  • 我目前得到的是一个Excel文件,其第一个单元格中包含内容"(object)" (2认同)