Angular 5 上 XLSX 的缩小版本?

rsc*_*rer 7 excel xlsx webpack angular angular5

是否有在 Angular 5 项目中使用缩小的 XLSX 的正确方法?

目前我将它用作:

import * as XLSX from 'xlsx';
Run Code Online (Sandbox Code Playgroud)

使用此导入,例如:

const worksheet: XLSX.WorkSheet = XLSX.utils.json_to_sheet(json);
Run Code Online (Sandbox Code Playgroud)

const workbook: XLSX.WorkBook = XLSX.utils.book_new();
Run Code Online (Sandbox Code Playgroud)

它工作得很好,但在我的构建中产生了一个非常大的包对象: 在此处输入图片说明

我想知道是否可以使用 .min 文件来帮助减少包大小。如果是这样,如何正确导入和使用它?

Ita*_*tay 4

这就是我在 Angular 中的做法:

    import('xlsx').then(xlsx => {});
Run Code Online (Sandbox Code Playgroud)

仅当用户单击我的 Excel 服务按钮时才会触发:) 这似乎是“不好的做法”,但xlsx实际上无法正确缩小..无论如何,它为我的捆绑包节省了1.2MB

GitHub 上的讨论:https://github.com/SheetJS/sheetjs/issues/694#issuecomment-688310069

获取类型需要额外(但很简单)的工作 - 阅读本文:如何使用动态导入的类型?

我受到这位遇到同样问题的开发人员的启发:https://netbasal.com/using-typescript-dynamic-imports-in-angular-d210547484dd

    import { Injectable } from '@angular/core';
    import * as FileSaver from 'file-saver';

    // import * as XLSX from 'xlsx';
    // import { utils, write } from 'xlsx';
    // import { WorkSheet, WorkBook } from 'xlsx';

    const EXCEL_TYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8';
    const EXCEL_EXTENSION = '.xlsx';
    
    @Injectable()
    export class ExcelService {
    
      constructor() { }
    
      public exportAsExcelFile(arrOfObjs: {}[], excelFileName: string): void {
        import('xlsx').then(xlsx => {
          // console.log(xlsx);
          const worksheet: import('xlsx').WorkSheet = xlsx.utils.json_to_sheet(arrOfObjs);
          console.log('worksheet', worksheet);
          const wb: import('xlsx').WorkBook = { Sheets: { data: worksheet }, SheetNames: ['data'] };
          if (!wb.Workbook) { wb.Workbook = {}; }
          if (!wb.Workbook.Views) { wb.Workbook.Views = []; }
          if (!wb.Workbook.Views[0]) { wb.Workbook.Views[0] = {}; }
          wb.Workbook.Views[0].RTL = true;
          const excelBuffer: BlobPart = xlsx.write(wb, { bookType: 'xlsx', type: 'array' });
          this.saveAsExcelFile(excelBuffer, excelFileName);
        });
      }
    
      private saveAsExcelFile(buffer: BlobPart, fileName: string): void {
        const data: Blob = new Blob([buffer], {
          type: EXCEL_TYPE
        });
        FileSaver.saveAs(data, fileName + '_export_' + new Date().getTime() + EXCEL_EXTENSION);
      }
    }

Run Code Online (Sandbox Code Playgroud)