如何正确地下载与Angular2的Excel文件

这是我的服务的代码,它使请求的响应一个xls文件:

exportInternalOrder(body) { let user_token: string = this.sessionService.getToken(); let headers = new Headers(); headers.append('responseType', 'arraybuffer'); headers.append('Authorization', 'Bearer ' + user_token); return this.http.post(this.config.exportInternalOrder, body,{ headers: headers }).map(res => new Blob([res._body],{ type: 'application/vnd.ms-excel' })); } 

哪个应该处理excel文件的响应。 这是调用它的代码:

 let objToSend = this.makeObjToSend(false); this.reportingService.exportExcel(objToSend) .subscribe( data => { this.exportData(data); }, error => { this.errorFilterMsg.push({ severity: 'error', detail: 'Report exporting has failed!' }); } ); 

这是文件的保存(由于某种原因,window.open什么都不做):

 exportData(data){ let blob = data; let a = document.createElement("a"); a.href = URL.createObjectURL(blob); a.download = 'fileName.xls'; document.body.appendChild(a); a.click(); } 

但该文件仍然保存为损坏的。 当使用邮差和curl它来确定。 任何帮助,将不胜感激。

responseType不应该在headers中设置,它是在post函数中作为第二个parameter passing的RequestOptionsArgs对象的一部分, RequestOptionsArgs包含headersresponseType和其他的文件,你可以在这里阅读更多关于它的信息 。 所以,你的代码应该是这样的:

 import { ResponseContentType } from '@angular/http'; exportInternalOrder(body) { let user_token: string = this.sessionService.getToken(); let headers = new Headers(); headers.append('Authorization', 'Bearer ' + user_token); return this.http.post(this.config.exportInternalOrder, body,{ headers: headers, responseType: ResponseContentType.Blob }).map(res => new Blob([res._body],{ type: 'application/vnd.ms-excel' })); }