//后端每页返回的数据拼接的数组
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>