0

According to luwojtaszek answer in this topic: How to Export JSON to CSV or Excel - Angular 2 I implemented a pice of code:

  public exportAsExcelFile(json: any[], excelFileName: string): void {
    const worksheet: XLSX.WorkSheet = XLSX.utils.json_to_sheet(json);
    const workbook: XLSX.WorkBook = {Sheets: {'data': worksheet}, SheetNames: ['data']};
    XLSX.writeFile(workbook, ExcelService.toExportFileName(excelFileName));
  }
}

Above code works fine and eventually generates an excel file. Because of size of data it takes few seconds to generate a file (almost 10 MB). I would like to show some fancy animation to notify user, that it is in progress. The problem is I can't return an observable, or I don't know how to use it properly.

I created a service that I inject through constructor and then I subscribe to function this way:

this.loading = true;      
return this._excelExporterService.exportAsExcelFile(this.data,'file').subscribe(x=> {
    if(x)
    this.loading = false;
})

and this is how my service looks:

  public exportAsExcelFile(json: any[], excelFileName: string): Observable<boolean> {
    const worksheet: XLSX.WorkSheet = XLSX.utils.json_to_sheet(json);
    const workbook: XLSX.WorkBook = {Sheets: {'data': worksheet}, SheetNames: ['data']};
    let x: boolean;
    XLSX.writeFile(workbook, ExcelExporterService.toExportFileName(excelFileName));
    return Observable.of(true);

  }
justme
  • 146
  • 10
  • What about adding await for exportAsExcelFile function and return XLSX.writeFile ;; public async exportAsExcelFile ... return XLSX.writeFile(workbook....} this._excelExporterService.exportAsExcelFile(this.data,'file').then(d =>{ this.loading = false }).catch(e=>{}) – Yasser Mas Aug 21 '19 at 19:17
  • Edited the answer to include an alternative. – LppEdd Aug 21 '19 at 19:21

2 Answers2

0

In the service
import { of } from 'rxjsx; In the function:
return of(true) ;`

0

documentation you can use:

public exportAsExcelFile(json: any[], excelFileName: string): Observable<boolean> {
    return new Observable((obs)=> { 
        const worksheet: XLSX.WorkSheet = XLSX.utils.json_to_sheet(json);
        const workbook: XLSX.WorkBook = {Sheets: {'data': worksheet}, SheetNames: ['data']};
        obs.next(true);
        XLSX.writeFileAsync(excelFileName, workbook, () => {
            obs.next(false);
        });
    });
}
exportAsExcelFile(json_any, 'testName').subscribe((resp:boolean)=>{
    loadind(resp);
});
elcordova
  • 66
  • 6