typescript - descărcarea fișierului xlsx în angular 2 cu blob


Vreau să descarc un fișier xlsx de la client pe Angular 2 folosind API-ul REST.

Primesc un array de biți ca răspuns la cererea mea GET și îl trimit funcției de descărcare cu subscribe:

let options = new RequestOptions({ search: params });
this.http.get(this.restUrl, options)
          .subscribe(this.download); 

funcție de descărcare folosind blob:

download(res: Response) {
let data = new Blob([res.arrayBuffer()], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;' });
FileSaver.saveAs(data, this.fileName);};

Problema mea este că fișierul meu este corupt tot timpul. Am încercat multe versiuni ale acestuia, dar nimic nu funcționează.

** de asemenea am încercat cu această soluție și nu funcționează (fișierul xlsx este încă corupt) - Angular 2 descărcarea unui fișier: rezultat corupt, diferența este că datele mele sunt un Buffer de tip array și nu un string sau json, și există o diferență între PDF și xlsx.

Mulțumesc de 10 ori!

Răspuns #1

Am avut aceeași problemă ca a ta - am rezolvat-o adăugând responseType: ResponseContentType.Blob la opțiunile mele Get. Verifică codul de mai jos:

public getReport(filters: ReportOptions) {
    return this.http.get(this.url, {
            headers: this.headers,
            params: filters,
            responseType: ResponseContentType.Blob
        })
        .toPromise()
        .then(response => this.saveAsBlob(response))
        .catch(error => this.handleError(error));
}

Funcția saveAsBlob() este doar un înveliș pentru FileSaver.SaveAs():

private saveAsBlob(data: any) {
    const blob = new Blob([data._body],
        { type: 'application/vnd.ms-excel' });
    const file = new File([blob], 'report.xlsx',
        { type: 'application/vnd.ms-excel' });

    FileSaver.saveAs(file);
}

Răspunsul #2

După ce nimic nu funcționează. Mi-am schimbat serverul pentru a returna aceeași matrice de octeți cu adăugarea de:

    response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    response.setHeader("Content-Disposition", "attachment; filename=deployment-definitions.xlsx");

La clientul meu am șters funcția de descărcare și în loc de partea GET am făcut:

window.open(this.restUrl, "_blank");

Aceasta este singura modalitate pe care am găsit-o posibilă pentru a salva un fișier xlsx care nu este corupt.

Dacă ai un răspuns despre cum să faci asta cu blob, te rog să-mi spui :)