Angular:从FileReader返回Observable / ES6 Promise
发布时间:2020-12-17 06:49:42 所属栏目:安全 来源:网络整理
导读:我试图从FileReader返回结果,我发现 this实现.但由于它已经过时,我想知道如何使用ES6 Promises或Rx Observable实现相同的功能. 下面是我的代码,参考上述链接,它按预期工作. import { Injectable } from '@angular/core';import * as XLSX from 'xlsx';import
我试图从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-9s_.-:])+(.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 }); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- scala – Spark:如何在LabeledPoint上执行欠采样?
- Be Angular | Bootstrap Admin Web App with AngularJS
- 全面解析Bootstrap图片轮播效果
- 有角度 – 将承诺转化为可观察
- angularjs – 启动新控制器时停止$timeout
- WebService到底是什么?
- angularjs – AngularFire $requireAuth未检测到过期的身份
- Angular 5接入Fundebug日志监控
- angularjs – $state和$stateProvider有什么区别?
- angularjs – 如何创建一个nggrid自定义页脚