Angularjs   发布时间:2022-04-20  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Angular:从FileReader返回Observable / ES6 Promise大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图从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
  });

大佬总结

以上是大佬教程为你收集整理的Angular:从FileReader返回Observable / ES6 Promise全部内容,希望文章能够帮你解决Angular:从FileReader返回Observable / ES6 Promise所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。