首页 > 解决方案 > Firebase with angular:仅将所选字段导出到使用 angular 检索的 firebase 中的 excel

问题描述

我的工作有问题。因为 Firebase 的 Web/JavaScript API 总是返回我们请求的节点下的完整树

因此,在我的情况下,我首先从 firebase 检索了所有现有字段,包括敏感字段,然后我只想导出到 excel 选定字段,而不是我得到的所有字段。问题是,我总是成功导出所有现有字段,包括敏感字段。

我可以只导出选定的字段并排除敏感字段吗?下面是我的代码:

我在我的 .ts 文件中检索我的所有字段,包括来自 firebase 的数据,如下所示:

 getData() {
    this.dataLoading = true;
    this.querySubscription = this._backendService.getDocs('report')
      .subscribe(members => {
        this.members = members;
        this.dataSource = new MatTableDataSource(members);
        this.dataSource.paginator = this.paginator;
        this.dataSource.sort = this.sort;
      },
        (error) => {
          this.error = true;
          this.errorMessage = error.message;
          this.dataLoading = false;
        },
        () => { this.error = false; this.dataLoading = false; });
  }

    //export func
    exportAsXLSX():void{
      this._backendService.exportAsExcelFile(this.members, 'sample');
    }

我的后端服务代码:

    getDocs(coll:string,filters?:any){
    this.itemsCollection=this.afs.collection<any>(this.getCollectionURL(coll));
    return this.itemsCollection.valueChanges();
  }

    getCollectionURL(filter){
        return "ReportApp/fajar/"+filter;
      }

    //export func
    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'] };
      const excelBuffer: any = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' });
      this.saveAsExcelFile(excelBuffer, excelFileName);
    }
    private saveAsExcelFile(buffer: any, fileName: string): void {
       const data: Blob = new Blob([buffer], {type: EXCEL_TYPE});
       FileSaver.saveAs(data, fileName + '_export_' + new  Date().getTime() + EXCEL_EXTENSION);
    }

至于参考我使用代码从这里导出到 excel:https ://medium.com/@madhavmahesh/exporting-an-excel-file-in-angular-927756ac9857

如您所见,我将所有数据放入this.member变量中并导出 em,但结果是我导出了所有 em,我只想导出选定的字段。

标签: excelangularfirebase

解决方案


exportAsExcelFile()在将成员数据发送到您的方法之前,您需要“修剪”该数组。您的问题是您将所有成员数据传递给该导出函数。所以解决方案是在调用导出函数之前删除所有敏感信息。

exportAsXLSX():void {
    // TRIM DOWN ARRAY HERE
    this._backendService.exportAsExcelFile(this.members, 'sample');
}

由于您没有提供您的成员数据库结构或您认为敏感信息的详细信息,我将提供一个通用示例。你有一个成员数组……很可能,你已经将数组中的每个“成员”都变成了一个对象……所以我们需要遍历该数组并删除每个成员对象的“敏感”属性。

作为预防措施,因为我们不想从 ACTUAL 数组中删除属性,因为数组是引用类型,并且由于您可能在其他地方需要这些详细信息......让我们制作一个数组的副本 -一个深层副本以确保甚至嵌套的对象也会被复制。

var newMemberArray = JSON.parse(JSON.stringify(this.members))

然后,我们需要遍历该新数组并删除我们的敏感属性:

newMemberArray.forEach(function(m){
    delete m.sensitivePropertyName1;
    delete m.sensitivePropertyName2;
});

并将该“净化”数组传递给您的导出函数......所以将所有这些放在一起,例如:

exportAsXLSX():void {
    var newMemberArray = JSON.parse(JSON.stringify(this.members))
    newMemberArray.forEach(function(m){ delete m.sensitivePropertyName });
    this._backendService.exportAsExcelFile(newMemberArray, 'sample');
}

*免责声明:未经测试的代码,仅用于解释目的


推荐阅读