How to download an excel file in Angular 8 as an API response
While using { responseType: 'blob'}
as said by most answers here works, I'd suggest using responseType: 'arraybuffer'
instead of blob
with observe: 'response'
. Your call would then look like this:
this.httpClient.get(resource, {
headers: this.httpHeaders, // Any custom client side headers like Authorization
observe: 'response',
responseType: 'arraybuffer'
});
The advantage of this is two-fold:
- Arraybuffer is a generic stream of bytes and the Blob object can be created using either a
blob
or anarraybuffer
, using theContent-Type
observe: 'response'
will also include the response headers that you set at the server in the parsed response.
I use this method to put the filename and the MIME Type of the arraybuffer
in the Content-Disposition
and Content-Type
response headers and then use a generic download service at the client-side.
Also, I would suggest using a File
object instead of just the Blob
, which gives you the flexibility of giving it a filename like so:
public downloadFile(response: any, fileName?: string) {
const blob = new Blob([response.body], { type: response.headers.get('content-type') });
fileName = fileName || response.headers.get('content-disposition').split(';')[0];
const file = new File([blob], fileName, { type: response.headers.get('content-type') });
saveAs(file);
}
This will also solve the problem that @knbibin raised about using a custom filename.
Set response-header { responseType: 'blob'}
in the request.
To download the excel, use the below function.
response - api response, fileName- excel name
downloadExcel(response, fileName) {
// Doing it this way allows you to name the file
var link = document.createElement('a');
link.href = window.URL.createObjectURL(res);
link.download = fileName;
link.click();
}
Add header { responseType: 'blob'}
Like this:
this.http.post<any>(apiEndpoint,request,{ responseType: 'blob'} )
You need to set the response-header
{ responseType: 'blob'}
in the request.You need to pass in the correct MIME-Type as you'are creating the blob-file. (f.e. application/octet-stream or application/vnd.openxmlformats-officedocument.spreadsheetml.sheet).
component.ts
downloadFile(data: Response) {
const blob = new Blob([data], { type: 'application/octet-stream' });
const url= window.URL.createObjectURL(blob);
window.open(url);
}