Angular 2 Лучший подход к использованию FileSaver.js

Мне нужно использовать FileSaver.js(https://github.com/eligrey/FileSaver.js/) в моем приложении Angular2.

Я знаю, что могу добавить его как файл script на главной странице html, и он будет работать. Но мне было интересно, какой был бы лучший подход в случае приложения Angular 2 (TypeScript), чтобы я мог просто вызвать window.saveAs для сохранения файла.

Ответ 1

Мне удалось заставить его работать с использованием этого подхода (Angular -CLI):

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

После этого импортируйте файл в компонент:

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. Просто установите библиотеку и введите ее, импортируйте, и вы готовы к работе.

Ответ 2

Если вы используете 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 для установки сторонних библиотек

Изменить 9/27/2017: Похоже, что теперь есть определение типа для FileSaver.js в соответствии с инструкциями README, поэтому вместо

declare module "file-saver"

вам просто нужно

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

Ответ 3

Просто выполнение npm install file-saver --save - хорошее начало. Вам также нужен файл объявления typescript (например, file-saver.d.ts или typings.d.ts), так как эта библиотека имеет простой javascript. Обычно вы можете получить его, выполнив npm install @types/file-saver, но этот пакет устарел.

Я создал файл-saver.d.ts для себя - просто поместите его в исходный каталог.

файл-saver.d.ts

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

Затем вы можете использовать saveA следующим образом:

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

Даже не так хорошо, как упоминали другие люди, я предпочитаю использовать существующий пакет от NPM, который называется ngx-filesaver.

Просто делать:

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');

      });
}