【问题标题】:How to read values from an Excel document using Angular如何使用 Angular 从 Excel 文档中读取值
【发布时间】:2023-01-02 03:44:19
【问题描述】:

我想读取一个 excel 文件并返回 this.listEmployeeImport 数组中的数据。当它调用 onImportExcel 方法时,它返回 []

 async onImportExcel(event:any){
    /* wire up file reader */
    this.file= event.target.files[0];
    let fileReader = new FileReader();
          fileReader.onload = (e) => {
              this.arrayBuffer = fileReader.result;
              var data = new Uint8Array(this.arrayBuffer);
              var arr = new Array();
              for(var i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]);
              var bstr = arr.join("");
              var workbook = XLSX.read(bstr, {type:"binary"});
              var first_sheet_name = workbook.SheetNames[0];
              var worksheet = workbook.Sheets[first_sheet_name];
              this.listEmployeeImport = (XLSX.utils.sheet_to_json(worksheet,{
                raw: false,
                dateNF: "dd/mm/yyyy"
              }));
  
           
  
          }
          await fileReader.readAsArrayBuffer(this.file);
   };

【问题讨论】:

    标签: angular


    【解决方案1】:

    解决方案 1 - 使用 Observable

    一种可能性是返回包装在可观察对象中的输出。例如你可以这样做:

        onImportExcel(event: any): Observable<any> {
            const reader = new FileReader();
            this.file = event.target.files[0];
    
            return new Observable((observer: any) => {
    
                reader.onload = (e) => {
    
                    // Code omitted for brevity 
                    
                    const result = (XLSX.utils.sheet_to_json(worksheet,{
                            raw: false,
                            dateNF: "dd/mm/yyyy"
                    }));
    
                    observer.next(result);
                    observer.complete();
                };
                reader.readAsArrayBuffer(this.file);
            });
        }
    

    然后你可以像这样调用方法:

    this.onImportExcel(ev).subscribe(res => console.log('Parsed Excel-Doc:', res));
    

    解决方案 2 - 使用 Promise

    实际上有一个替代解决方案,其中返回一个 Promise 而不是一个 observable。 与解决方案 1 类似,此解决方案是异步解决方案,因为必须等待返回值。

        async importExcelDoc(event: any) {
            const file = event.target.files[0];
            const result = await this.parseExcelDoc(file).catch(err => console.error(err));
            console.log('Parsed Excel-Doc:', result);
        }
    
        parseExcelDoc(file: File): Promise<any> {
            /* wire up file reader */               
            let fileReader = new FileReader();
            return new Promise((resolve, reject) => {
                fileReader.onload = (e) => {
    
                    // Code omitted for brevity 
    
                    const result = (XLSX.utils.sheet_to_json(worksheet,{
                        raw: false,
                        dateNF: "dd/mm/yyyy"
                    }));
                    resolve(result);          
                }
                fileReader.onerror = reject;
                fileReader.readAsArrayBuffer(file);
            });
        };
    

    【讨论】:

    • 我想异步读取文件
    • 我现在添加(并测试了!)第二个解决方案,使用 Promise 而不是 Observable。我的两个解决方案实际上都是异步的,因为您需要等待返回值。等待readAsArrayBuffer() 没有任何意义,因为在完成此方法后,Excel 文档尚未完全处理。所以此时返回一个值是没有用的。
    猜你喜欢
    • 2021-04-29
    • 2020-03-21
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多