//后端每页返回的数据拼接的数组

  eventsConcatResult = (events: any[]) => {        let eventExcel:any[]=[]        for (let j = 0; j < events.length; j++) {          let array = [];          array.push(events[j].camera['_id'])          array.push(events[j].camera.alias)          array.push((events[j].camera.parent && events[j].camera.parent['_id']) ? events[j].camera.parent['_id'] : "无")          array.push((events[j].camera.parent.parent && events[j].camera.parent.parent['_id']) ? events[j].camera.parent.parent['_id'] : "无")          array.push(events[j].category)          switch (events[j].category) {            case 0:              array.push("产品")              break;            case 1:              array.push("报警")              break;            case -1:              array.push("未知")              break;            default:              break;          }          array.push(events[j].code)          switch (events[j].code) {            case 1:              array.push("人进入")              break;            case 2:              array.push("人来到")              break;            case 3:              array.push("人停留")              break;            case -1:              array.push("未知")              break;            default:              break;          }          array.push(`${this.utilsService.$server}${events[j].video_url}`)          array.push(events[j].event_timeStamp)          array.push(events[j].timeStamp)          eventExcel.push(array)        }    return eventExcel;  };

//采纳递归的办法实现循环内异步调用接口,并且循环一页将这页拼接的数组放到excel流里。

  excel(condition: EventSearchCondition) {    this.wb= XLSX.utils.book_new();    this.ws = XLSX.utils.aoa_to_sheet(this.excelData);    this.utilsService.$http.post<any>(this.utilsService.$server + '/api/events', {      condition: condition,      sort: this.sort.active || null,      order: this.sort.direction || null,      pageNumber: 0,      entriesPerPage: this.entriesPerPage    }).subscribe(async (events: any) => {      let pagesTotalCount = Math.ceil(events.totalEvents / this.entriesPerPage)-1      const fetchSinglePage = (pageNumber: number): void => {        if (pageNumber>pagesTotalCount){          console.log(this.ws)          XLSX.utils.book_append_sheet(this.wb, this.ws, 'event');          XLSX.writeFile(this.wb, '事件记录.xlsx');          return;        }        this.utilsService.$http.post<any>(this.utilsService.$server + '/api/events', {          condition: condition,          sort: this.sort.active || null,          order: this.sort.direction || null,          pageNumber:pageNumber,          entriesPerPage: this.entriesPerPage        }).subscribe((item: any) => {          XLSX.utils.sheet_add_aoa(this.ws, this.eventsConcatResult(item.eventsList),{origin: -1});          // console.log(this.ws)          fetchSinglePage(pageNumber + 1)        })      }      fetchSinglePage(0)    })  }

//调用接口

  async ExportExcel(){    //获取原生的所有events    await this.excel(this.searchCondition)  }

//前端按钮

<button mat-button color="primary" (click)="ExportExcel()">{{ 'Export' | translate }}</button>