Angular 2最佳使用FileSaver.js的方法

22

我需要在我的Angular2应用中使用FileSaver.js (https://github.com/eligrey/FileSaver.js/)。

我知道我可以将它作为脚本文件添加到主HTML页面中,并且它会工作。但是我想知道在Angular 2 (TypeScript)应用程序中,最好的方法是什么,这样我就可以仅调用window.saveAs来保存文件。


你使用哪个构建工具? - Stefan Negele
4个回答

73

我使用这种方法(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中不需要添加任何内容。只需安装库及其类型,导入即可开始使用。


有没有办法触发提示而不是自动下载? - Jeff
这对我非常有效,但我甚至不需要安装第二个@types/file-saver包。另外:@JasonBourne,你拼错了“file”:P - jlh
1
我得到了 FileSaver.saveAs is not a function。看起来我导入的 FileSaver 实际上是函数 saveAs。就好像 @type 和实现之间存在差异。 - ronif
3
你可以在 devDependencies 中保存: npm install @types/file-saver --save-dev - Luca Basilico
1
@RDV,是的,这是设计上的。 - Tomislav
显示剩余5条评论

16

如果你正在使用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

我遇到了与上述描述相同的挑战,但我没有使用angular-cli。我安装了filesaver模块,并将其添加到了我的system.config.js中。然而,在加载某些filesaver依赖项时,它会出现404错误,因为它找不到.js扩展名来加载它们。请帮忙解决。 - mayowa ogundele
@Elliott08 应该可以!我至少在一个 Angular 5 项目中使用过它。 - cbierman

4

只需要执行 npm install file-saver --save 就是一个好的开始。您还需要一个 TypeScript 声明文件(例如 file-saver.d.tstypings.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);

1
感谢您提供filesaver.d.ts文件。这就是我所需要的。 - AndrewBenjamin

2

虽然不是像其他人提到的那样好的方法,但我更喜欢使用来自NPM的现有包,名为ngx-filesaver。 它甚至可以与Angular Universal很好地配合使用。

只需执行以下操作:

npm install file-saver ngx-filesaver --save


将其包含到您的模块项目中:


Translated:
...
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

最初的回答:


ngx-filesaver 依赖于 filesaver.js,但这仍然没有解决问题。 - elliotwesoff
不确定你所说的“不能解决问题”是什么意思,在这个帖子的另一个答案中,通过使用自定义的TypeScript定义,它甚至可以工作:https://dev59.com/LFkS5IYBdhLWcg3wMT6s#41265382。 - Bayu
当我安装FileSaverService时,仍然遇到了相同的错误。仅仅安装@types/file-saver也没有解决我的问题,可能是因为我在严格模式下使用angular。有效的方法是安装file-saver-es,在我的代码中引用"file-saver-es",然后在我的tsconfig.json中将"file-saver-es"重定向到@types/file-saver。很烦,但这是唯一有效的配置方法。 - elliotwesoff
1
以前从未有过这样的经历。谢谢分享。希望能帮助其他人。 - Bayu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接