我试图从FileReader返回结果,我发现
this实现.但由于它已经过时,我想知道如何使用ES6 Promises或Rx Observable实现相同的功能.
下面是我的代码,参考上述链接,它按预期工作.
import { Injectable } from '@angular/core'; import * as XLSX from 'xlsx'; import * as XLS from 'xlsx'; @Injectable() export class ExcelReaderService { constructor() { } importFromExcel(ev): JQueryPromise<any> { let deferred = $.Deferred(); let regex = /^([a-zA-Z0-9\s_\\.\-:])+(.xlsx|.xls)$/; let workbook; let excelInJSON; if (regex.test(ev.target.files[0].name.toString().toLowerCase())) { let xlsxflag = false; /*Flag for checking whether excel is .xls format or .xlsx format*/ if (ev.target.files[0].name.toString().toLowerCase().indexOf(".xlsx") > 0) { xlsxflag = true; } let fileReader = new FileReader(); fileReader.onload = (ev) => { let binary = ""; let bytes = new Uint8Array((<any>ev.target).result); let length = bytes.byteLength; for (let i = 0; i < length; i++) { binary += String.fromCharCode(bytes[i]); } /*Converts the excel data in to json*/ if (xlsxflag) { workbook = XLSX.read(binary,{ type: 'binary',cellDates: true,cellStyles: true }); // only first sheet excelInJSON = XLSX.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[0]]); deferred.resolve(excelInJSON); } else { workbook = XLS.read(binary,cellStyles: true }); excelInJSON = <{}[]>XLS.utils.sheet_to_row_object_array(workbook.Sheets[workbook.SheetNames[0]]); deferred.resolve(excelInJSON); } } // init read if (xlsxflag) fileReader.readAsArrayBuffer((<any>ev.target).files[0]); else fileReader.readAsBinaryString((<any>ev.target).files[0]); } else { deferred.reject('Invalid file!'); } return deferred.promise(); } }
在消费者组件中
this.excelReaderService.importFromExcel(ev).then((result) => { this.detailHeadings = Object.keys(result[0]); this.detailData = result; })
如果有人帮助我,因为我是异步编程的新手,这将是很棒的.
解决方法
这就是我做的方式,如果有人想要一个Angular服务,它读取Excel文件并以可观察的内容作为JSON进行响应.
我正在使用SheetJS来读取文件并输出JSON.
import { Injectable } from '@angular/core'; import { Observable } from 'rxjs/Observable'; import * as XLSX from 'xlsx'; @Injectable() export class ExcelReaderService { constructor() { } importFromExcel(ev): Observable<any> { let workbook; let excelInJSON; const fileReader = new FileReader(); // init read fileReader.readAsArrayBuffer((<any>ev.target).files[0]); return Observable.create(observer => { // if success fileReader.onload = ev => { let binary = ""; let bytes = new Uint8Array((<any>ev.target).result); let length = bytes.byteLength; for (let i = 0; i < length; i++) { binary += String.fromCharCode(bytes[i]); } // Converts the excel data in to json workbook = XLSX.read(binary,cellStyles: true }); // only first sheet excelInJSON = XLSX.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[0]]); observer.next(excelInJSON); } // if failed fileReader.onerror = error => observer.error(error); }); } }
从组件中,只需将事件传递给此服务,如下所示,它将使用JSON进行响应.
this.excelReaderService.importFromExcel(ev) .subscribe(response => { // do something with the response });