Angular convert excel поврежден - PullRequest
0 голосов
/ 09 июля 2020

Мой проект использует angular и теперь вызывает api, чтобы получить byte [] файла excel. Но когда я конвертирую byte [] в файл с помощью blob, этот файл поврежден. Кто-нибудь может мне помочь Мой Angular - это версия 9

service.ts:

downloadFile(req?: any): any {
    const options = createRequestOption(req);
    return this.http.get(`${this.resourceUrl}/print`, {
       params: options,
       responseType:'blob' })
   .toPromise();
}

component.ts:

  import {saveAs} from 'file-saver';

  export():void{
    this.exportService.downloadFile({}) .then((blob:any)=> {
        saveAs(blob, 'test.xlsx');
        });
     }
  }

Ответ API enter image description here

My excel file: введите описание изображения здесь

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

Не сам, спасибо. Я не уверен, какой ответ лучше, но эта работа

 testByte(filename = ''): Observable<HttpResponse<string>>{
  return this.http.get(`${this.resourceUrl}/testByte`, {
    responseType: 'text',
    observe: 'response'
  }).pipe(map((res: HttpResponse<string>) => this.byteToFile(res,filename)));
}


private byteToFile(res: HttpResponse<string>,filename:string): HttpResponse<string> {
    if(res.body){
     const fileName = filename;
     const a = document.createElement('a');
     document.body.appendChild(a);
     const sliceSize = 512;

     const byteCharacters = res.body;
     const byteArrays = [];

     for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
       const slice = byteCharacters.slice(offset, offset + sliceSize);

       const byteNumbers = new Array(slice.length);
       for (let i = 0; i < slice.length; i++) {
         byteNumbers[i] = slice.charCodeAt(i);
       }

      const byteArray = new Uint8Array(byteNumbers);

      byteArrays.push(byteArray);
    }

    const blob = new Blob(byteArrays, {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'});
    const fileURL = window.URL.createObjectURL(blob);
    a.href = fileURL;
    a.download = fileName;
    a.click();
  }
  return res.clone();
}
0 голосов
/ 09 июля 2020

Пожалуйста, измените тип ответа, как показано ниже:

downloadFile(req?: any): any {
    const options = createRequestOption(req);
    return this.http.get(`${this.resourceUrl}/print`, {
       params: options,
       responseType: ResponseContentType.Blob })
   .toPromise();
}

Измените свой код на код ниже, добавив Blob

export():void{
    this.exportService.downloadFile({}) .then((data:any)=> {

let blob = new Blob([data], {type: 'text/csv'});
        saveAs(blob, 'test.xlsx');
        });
     }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...