web-dev-qa-db-ja.com

Angular 2 FileSaver.jsを使用する最良の方法

Angular2アプリケーションでFileSaver.js( https://github.com/eligrey/FileSaver.js/ )を使用する必要があります。

メインのhtmlページにスクリプトファイルとして追加できれば機能します。しかし、Angular 2(TypeScript)アプリケーションの場合、window.saveAsを呼び出してファイルを保存できるようにするための最善の方法は何だろうと思っていました。

17
Naveed Ahmed

私はこのアプローチ(Angular-CLI)を使用して機能させることができました。

npm install file-saver --save
npm install @types/file-saver --save

その後、コンポーネントにFilesaverをインポートします。

import * as FileSaver from 'file-saver';

そして、次のように使用できます。

    let blob = new Blob([document.getElementById('exportDiv').innerHTML], {
            type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-16le"
        });
    FileSaver.saveAs(blob, "export.xls");    

ご覧のとおり、angular-cli.jsonに何も追加する必要はありません。ライブラリとそのタイプをインストールするだけでインポートできます。準備は完了です。

61
Tomislav

Angular-CLIを使用してプロジェクトをビルドしている場合は、次を実行してインストールできます。

npm install file-saver --save

FileSaverにはタイピングがないため、次の操作を行う必要がありました。

declare module "file-saver";

typings.d.tsファイル内。

次に、それを使用するには:

// Import
import * as FileSaver from "file-saver";

//Implementation
FileSaver.saveAs(blob, filename);

参考のため、これらの手順は サードパーティライブラリをインストールするためのAngular-Cliの手順

Edit 9/27/2017:FileSaver.jsのタイプ定義があるようです READMEの指示に従って ので、代わりに

declare module "file-saver"

あなたはただする必要があります

npm install @types/file-saver --save-dev
16
cbierman

ただnpm install file-saver --saveは良いスタートです。また、TypeScript宣言ファイル(file-saver.d.tsまたはtypings.d.ts)このライブラリの場合は、プレーンjavascriptです。通常、npm install @types/file-saverしかし、このパッケージは現在古くなっています。

自分用にfile-saver.d.tsを作成しました。ソースディレクトリに配置してください。

file-saver.d.ts

declare function saveAs(data: Blob, filename: string, noAutoBOM?: boolean): void;
declare module 'file-saver' {
    export = saveAs;
}

次に、次のようにsaveAsを使用できます。

your.ts

import saveAs = require('file-saver');
function save() {
    let blob = new Blob(['Hello world!'], { type: 'text/plain;charset=utf-8' });
    saveAs(blob, 'newcontrol.txt');
}

もちろん、ローダーの構成を更新することを忘れないでください。

SystemJSの場合、次のようなものが必要です。

/**
 * System configuration for Angular samples
 * Adjust as necessary for your application needs.
 */
(function (global) {
  System.config({
    paths: {
      // paths serve as alias
      'npm:': 'node_modules/'
    },
    // map tells the System loader where to look for things
    map: {
      // our app is within the app folder
      app: 'app',

      // angular bundles
      '@angular/core': 'npm:@angular/core/bundles/core.umd.js',
      '@angular/common': 'npm:@angular/common/bundles/common.umd.js',
      '@angular/compiler': 'npm:@angular/compiler/bundles/compiler.umd.js',
      '@angular/platform-browser': 'npm:@angular/platform-browser/bundles/platform-browser.umd.js',
      '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js',
      '@angular/http': 'npm:@angular/http/bundles/http.umd.js',
      '@angular/router': 'npm:@angular/router/bundles/router.umd.js',
      '@angular/forms': 'npm:@angular/forms/bundles/forms.umd.js',

      // other libraries
      'rxjs':                      'npm:rxjs',
      'angular-in-memory-web-api': 'npm:angular-in-memory-web-api/bundles/in-memory-web-api.umd.js',
      'file-saver':                'npm:file-saver'
    },
    // packages tells the System loader how to load when no filename and/or no extension
    packages: {
      app: {
        main: './main.js',
        defaultExtension: 'js'
      },
      rxjs: {
        defaultExtension: 'js'
      },
      'file-saver': {
        main: './FileSaver.js',
        defaultExtension: 'js'
      }
    }
  });
})(this);
4
Ted

他の人が言ったような素晴らしい方法ではありませんが、ngx-filesaverと呼ばれるNPMの既存のパッケージを使用することを好みます。 Angular Universalでも問題なく動作します。

ただやる:

npm install file-saver ngx-filesaver --save


モジュールプロジェクトに含める:

...
import { FileSaverModule } from 'ngx-filesaver';
...
@NgModule({
  imports: [ FileSaverModule ]
})
...


次に、コンポーネントにサービスをロードします:

....
import {FileSaverService} from 'ngx-filesaver';
...

@Component({
    ...
})
...
constructor(Http, private fileSaverService: FileSaverService) {
}

onSave() {
 workbook.xlsx.writeBuffer()
      .then( (buffer) => {

        //I am saving spreadsheed ( XLSX ) buffer here...
        this.fileSaverService.save(new Blob([buffer], { type: 'application/octet-stream'}), `${fileName}.xlsx`);

      });
}

詳細をご覧ください: https://www.npmjs.com/package/ngx-filesaver

0
Bayu