如何在角度2中使用SheetJS(js-xlsx)

时间:2016-08-06 12:47:31

标签: angular xlsx

我正在学习angular2,我想在我的项目中使用js-xlsx库。

我安装了xlsx npm install xlsx和jszip npm install jszip并将其添加到我的index.html中

<script src="node_modules/xlsx/dist/xlsx.core.min.js"></script>

<script src="node_modules/jszip/dist/jszip.min.js"></script>

并添加了打字稿定义tsd install xlsx

我正在使用webpack

但是当我在

中使用它时
import * as xlsx from 'xlsx';

但我得到错误 module build failed: error: cannot resolve module 'xlsx'

6 个答案:

答案 0 :(得分:7)

以下是使用Angular 2/4上的js-xlsx lib从对象数组导出xlsx文件的工作组件:

import { Component, OnInit } from '@angular/core';

import { utils, write, WorkBook } from 'xlsx';

import { saveAs } from 'file-saver';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
  title = 'app';
  table = [
    {
      First: 'one',
      Second: 'two',
      Third: 'three',
      Forth: 'four',
      Fifth: 'five'
    },
    {
      First: 'un',
      Second: 'deux',
      Third: 'trois',
      Forth: 'quatre',
      Fifth: 'cinq'
    },
  ];

  ngOnInit() {
    const ws_name = 'SomeSheet';
    const wb: WorkBook = { SheetNames: [], Sheets: {} };
    const ws: any = utils.json_to_sheet(this.table);
    wb.SheetNames.push(ws_name);
    wb.Sheets[ws_name] = ws;
    const wbout = write(wb, { bookType: 'xlsx', bookSST: true, type: 
'binary' });

function s2ab(s) {
  const buf = new ArrayBuffer(s.length);
  const view = new Uint8Array(buf);
  for (let i = 0; i !== s.length; ++i) {
    view[i] = s.charCodeAt(i) & 0xFF;
  };
  return buf;
}

saveAs(new Blob([s2ab(wbout)], { type: 'application/octet-stream' }), 'exported.xlsx');
  }
}

您必须安装xlsx和文件保护程序才能工作。

关于从Angular2 / 4上的jsons数组导出xlsx文件的工作示例:

https://github.com/bogdancar/xlsx-json-to-xlsx-demo-Angular2

答案 1 :(得分:5)

更简单的方法是根本不使用打字:

  1. 将xlsx.core.min.js添加到index.html文件中。 (我使用angular-cli,所以我的js文件被复制到dist / vendor目录)

    <script src="vendor/xlsx/dist/xlsx.core.min.js"></script>

  2. 在您的模块中,不要使用导入,而是在导入块下声明XLSX。

    declare var XLSX: any;

  3. 如果您正在使用angular-cli,则需要将xlsx添加到angular-cli-build.js文件中。

    module.exports = function(defaults) {
      return new Angular2App(defaults, {
        vendorNpmFiles: [
          'systemjs/dist/system-polyfills.js',
          'systemjs/dist/system.src.js',
          'zone.js/dist/**/*.+(js|js.map)',
          'es6-shim/es6-shim.js',
          'reflect-metadata/**/*.+(ts|js|js.map)',
          'rxjs/**/*.+(js|js.map)',
          '@angular/**/*.+(js|js.map)',
          'moment/moment.js',
           ....
          'xlsx/**/*.+(js|js.map)'
        ]})
    };
    

答案 2 :(得分:3)

试用ts-xlsx,使用起来很简单 npm install --save ts-xlsx然后安装印刷品npm install --save @types/xlsx

/* You can use as namespace: */
import * as XLSX from 'ts-xlsx';
let wb: XLSX.IWorkBook = XLSX.read(...)

/* Or straight forward import */
import { read, IWorkBook } from 'ts-xlsx';
let wb: IWorkBook = read(...)

答案 3 :(得分:1)

您可能尝试的其他方法是更改​​链接以使用完整版本,而不是核心。以下对我有用:

<script lang="javascript" src="dist/xlsx.full.min.js"></script>

这将随您的路径而变化。你的将是:

<script src="node_modules/xlsx/dist/xlsx.full.min.js"></script>

答案 4 :(得分:1)

要使xlsx适用于角度2+,您不需要安装任何类型。因为xlsx库在包本身中包含所需的类型。

步骤1:使用npm

安装xlsx
npm install xlsx

第2步:在服务/组件中导入xlsx。

const XLSX = require('xlsx');

OR 

import * as XLSX from 'xlsx'; - (这对我不起作用)

步骤3:您可以使用如下的XLSX。

XLSX.utils.json_to_sheet(json);

答案 5 :(得分:0)

我安装了xlsx包,例如&#34; npm install --save xlsx&#34;。 它使用xlsx作为依赖项更新了package.json文件。现在在我的组件中我可以导入它,例如&#34;从xlsx&#39;导入*作为XLSX &#34 ;. 我使用Angular 4.我想,在Angular 2中它应该以完全相同的方式工作。 附:无需在index.html中包含javascript文件。