【问题标题】:Ionic | TypeError | fs.createWriteStream is not a function离子 |类型错误 | fs.createWriteStream 不是函数
【发布时间】:2017-12-28 21:36:34
【问题描述】:

我正在尝试创建一个示例 excel 文件,但我收到错误“fs.createWriteStream 不是函数”。 下面是创建文件的代码-

import { Component } from '@angular/core';
import { NavController, Platform } from 'ionic-angular';
import * as Excel from "exceljs/dist/exceljs.js";

@Component({
  selector: 'page-home',
  templateUrl: 'home.html'
})
export class HomePage {

  constructor(platform: Platform) {
    platform.ready().then(() => {
      this.createSheetUsingExcelJs();
    });
  }

  ionViewDidLoad() {
  }

  createSheetUsingExcelJs() {
    let workbook = new Excel.Workbook();
    var worksheet = workbook.addWorksheet('My Sheet');

    worksheet.columns = [
      { header: 'Id', key: 'id', width: 10 },
      { header: 'Name', key: 'name', width: 32 },
      { header: 'D.O.B.', key: 'DOB', width: 10 }
    ];
    worksheet.addRow({ id: 1, name: 'Ionic Android', dob: new Date(1970, 1, 1) });
    worksheet.addRow({ id: 2, name: 'Ionic iOS', dob: new Date(1965, 1, 7) });
    var tempFilePath = 'C:/Users/mahmad/Downloads/temp.xlsx';
    console.log(workbook);

    workbook.xlsx.writeFile('temp.xlsx').then(function () {
      console.log('file is written');
    });
  }
}

请提出解决此问题的解决方案

【问题讨论】:

    标签: typescript ionic-framework ionic3 exceljs


    【解决方案1】:

    从“exceljs/dist/exceljs.js”导入*为Excel;

    要从 javascript 文件导入 typescript,需要使用库的类型定义文件。

    npm 中可用。

    做:

    npm i @types/exceljs --save-dev
    

    为了导入:

    import * as Excel from 'exceljs';
    

    您可以在“DefinitelyTyped”repo的测试文件中查看样本

    【讨论】:

    • 我尝试使用该命令,但现在我收到错误“未捕获的类型错误:无法读取未定义的属性'原型'”。
    • 知道它把它扔到哪里了吗?如果 lib 有问题,也许值得提出一个 github 问题请求
    • 它被抛出在启动屏幕上。甚至没有调用我的 HomePage 构造函数。
    • 通过将其注释掉来检查它是否确实来自您正在使用的库。如果是这样,我建议在他们的回购中提出一个问题..
    • 我已经在那里提出,但没有回应。我尝试使用 ecxeljs 和 SheetJS 库,当调用 writeFile() 方法时,这两个库都抛出错误。我花了一整天,但无法解决它。无论如何,感谢您的宝贵时间。
    【解决方案2】:

    最后,使用ts-xlsx library 完成任务。 以下是我的代码-

    import { Component, Injectable } from '@angular/core';
    import { NavController, Platform } from 'ionic-angular';
    import * as XLSX from 'ts-xlsx';
    import { File } from '@ionic-native/file';
    import { EmailComposer } from '@ionic-native/email-composer';
    
    declare var cordova: any;
    declare var window;
    
    @Component({
      selector: 'page-home',
      templateUrl: 'home.html',
      providers: [File]
    })
    
    @Injectable()
    export class HomePage {
    
      sheetNames: string[] = []
      sheets: any;
    
      constructor(public emailComposer: EmailComposer, platform: Platform, public file: File) {
        var objects = [["Header 1", "Header 2", "Header 3"], ["Value 1 1", "Value 1 2", "Value 1 3"], ["Value 2 1", "Value 2 2", "Value 2 3"]];
    
        platform.ready().then(() => {
          console.log(cordova.file.externalCacheDirectory + "report.xlsx");
          this.createXSLX(objects);
          this.sendEmail(cordova.file.externalCacheDirectory + "report.xlsx");
        });
      }
    
      createXSLX(data: any) {
    
        var pathFile = "";
        var fileName = "report.xlsx";
        let ws_name = "OrderDetails";
    
        let wb: XLSX.IWorkBook = {
          SheetNames: [],
          Sheets: {},
          Props: {}
    
        };
        let ws = this.sheet_from_array_of_arrays(data, {});
    
        /* add worksheet to workbook */
        wb.SheetNames.push(ws_name);
        wb.Sheets[ws_name] = ws;
        let wbout = XLSX.write(wb, { bookType: 'xlsx', type: 'binary' });
    
        let xslxBlob = new Blob([this.s2ab(wbout)], { type: "application/octet-stream" });
        pathFile = cordova.file.externalCacheDirectory;
        this.file.writeFile(pathFile, fileName, xslxBlob);
      }    
    
      sendEmail(data) {    
        this.emailComposer.isAvailable().then((available: boolean) => {
          if (available) {
            //Now we know we can send
          }
        });
    
        let email = {
          to: '',
          attachments: [data],
          subject: 'XLSX File',
          body: 'How are you? Nice greetings from Leipzig',
          isHtml: true
        };
    
        // Send a text message using default options
        this.emailComposer.open(email);
      }
    
    
      datenum(v, date1904): any {
        if (date1904) v += 1462;
        let epoch: any = Date.parse(v);
        return (epoch - new Date(Date.UTC(1899, 11, 30)).getTime()) / (24 * 60 * 60 * 1000);
      }
    
      sheet_from_array_of_arrays(data, opts) {
        let ws = {};
        let range = { s: { c: 10000000, r: 10000000 }, e: { c: 0, r: 0 } };
        for (let R = 0; R != data.length; ++R) {
          for (let C = 0; C != data[R].length; ++C) {
            if (range.s.r > R) range.s.r = R;
            if (range.s.c > C) range.s.c = C;
            if (range.e.r < R) range.e.r = R;
            if (range.e.c < C) range.e.c = C;
            let cell: any = { v: data[R][C] };
            if (cell.v == null) continue;
            let cell_ref = XLSX.utils.encode_cell({ c: C, r: R });
    
            if (typeof cell.v === 'number') cell.t = 'n';
            else if (typeof cell.v === 'boolean') cell.t = 'b';
            else if (cell.v instanceof Date) {
              cell.t = 'n';
              //cell.z = XLSX.SSF._table[14];
              cell.v = this.datenum(cell.v, null);
            }
            else cell.t = 's';
    
            ws[cell_ref] = cell;
          }
        }
        if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range.s, range.e);
        return ws;
      }
    
      s2ab(s) {
        let buf = new ArrayBuffer(s.length);
        let view = new Uint8Array(buf);
        for (let i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
        return buf;
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-30
      • 1970-01-01
      • 2023-01-24
      • 2016-02-26
      • 2013-04-01
      • 2016-03-06
      相关资源
      最近更新 更多