首页 > 解决方案 > 角转换excel损坏

问题描述

我的项目使用 angular,现在调用 api 来获取 excel 文件的字节 []。但是当我通过 blob 将 byte[] 转换为文件时,该文件已损坏。有人可以帮我吗
我的 Angular 是第 9 版

服务.ts:

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

组件.ts:

  import {saveAs} from 'file-saver';

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

API 响应 在此处输入图像描述

我的excel文件: 在此处输入图像描述

标签: arraysangulartypescriptblobexport-to-excel

解决方案


不要一个人,tks。我不确定什么是最好的答案,但这项工作

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

推荐阅读