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