我需要在我的Angular2应用中使用FileSaver.js (https://github.com/eligrey/FileSaver.js/)。
我知道我可以将它作为脚本文件添加到主HTML页面中,并且它会工作。但是我想知道在Angular 2 (TypeScript)应用程序中,最好的方法是什么,这样我就可以仅调用window.saveAs来保存文件。
我需要在我的Angular2应用中使用FileSaver.js (https://github.com/eligrey/FileSaver.js/)。
我知道我可以将它作为脚本文件添加到主HTML页面中,并且它会工作。但是我想知道在Angular 2 (TypeScript)应用程序中,最好的方法是什么,这样我就可以仅调用window.saveAs来保存文件。
我使用这种方法(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中不需要添加任何内容。只需安装库及其类型,导入即可开始使用。
@types/file-saver
包。另外:@JasonBourne,你拼错了“file”:P - jlhFileSaver.saveAs is not a function
。看起来我导入的 FileSaver
实际上是函数 saveAs
。就好像 @type 和实现之间存在差异。 - ronif如果你正在使用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 安装第三方库的步骤
编辑于2017年9月27日: 根据README说明,现在似乎已经有一个FileSaver.js的类型定义了,所以不需要再按照原来的步骤进行安装。
declare module "file-saver"
你只需要 这样做
npm install @types/file-saver --save-dev
只需要执行 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;
}
import saveAs = require('file-saver');
function save() {
let blob = new Blob(['Hello world!'], { type: 'text/plain;charset=utf-8' });
saveAs(blob, 'newcontrol.txt');
}
/**
* 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);
虽然不是像其他人提到的那样好的方法,但我更喜欢使用来自NPM的现有包,名为ngx-filesaver。 它甚至可以与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
最初的回答: