xlsx Excel 操作

一个基于 SheetJS 的Excel文件操作,它是目前在浏览器中包含最全的Excel操作的脚本库。

注:你也可以使用 js-xlsx 是另一个 Fork sheetjs 的类库,它提供包括:图片、样式等额外选项。最后你利用 callback 选项重要渲染你的 excel。

依赖

  1. yarn add file-saver

由于 sheetjs 脚本大小以及对 Excel 的操作并不是刚需的原因,因此采用一种延迟加载脚本的形式,可以通过全局配置配置来改变默认 CDN 路径(或使用本地路径),默认情况下使用 //cdn.bootcss.com/xlsx/0.15.6/xlsx.full.min.js

  1. import { XlsxModule } from '@delon/abc/xlsx';

代码演示

xlsx Excel 操作 - 图1

导入

导入Excel并输出JSON,支持 File、URL 格式。

  1. import { Component } from '@angular/core';
  2. import { XlsxService } from '@delon/abc/xlsx';
  3. @Component({
  4. selector: 'components-xlsx-import',
  5. template: `
  6. <button nz-button (click)="url()">Via Url</button>
  7. <input type="file" (change)="change($event)" multiple="false" class="ml-sm" />
  8. <p class="mt-sm">result: {{data | json}}</p>
  9. `,
  10. })
  11. export class ComponentsXlsxImportComponent {
  12. constructor(private xlsx: XlsxService) {}
  13. data: any;
  14. url() {
  15. this.xlsx.import(`./assets/demo.xlsx`).then(res => this.data = res);
  16. }
  17. change(e: Event) {
  18. const node = e.target as HTMLInputElement;
  19. this.xlsx.import(node.files![0]).then(res => this.data = res);
  20. node.value = '';
  21. }
  22. }

xlsx Excel 操作 - 图2

导出

导出Excel并自动弹出保存对话框。

  1. import { Component } from '@angular/core';
  2. import { STColumn } from '@delon/abc/st';
  3. import { XlsxService } from '@delon/abc/xlsx';
  4. @Component({
  5. selector: 'components-xlsx-export',
  6. template: `
  7. <button nz-button (click)="download()">Export</button>
  8. <st [data]="users" [ps]="3" [columns]="columns" class="mt-sm"></st>
  9. `,
  10. })
  11. export class ComponentsXlsxExportComponent {
  12. constructor(private xlsx: XlsxService) {}
  13. users: any[] = Array(100)
  14. .fill({})
  15. .map((_item: any, idx: number) => {
  16. return {
  17. id: idx + 1,
  18. name: `name ${idx + 1}`,
  19. age: Math.ceil(Math.random() * 10) + 20,
  20. };
  21. });
  22. columns: STColumn[] = [
  23. { title: '编号', index: 'id', type: 'checkbox' },
  24. { title: '姓名', index: 'name' },
  25. { title: '年龄', index: 'age' },
  26. ];
  27. download() {
  28. const data = [this.columns.map(i => i.title)];
  29. this.users.forEach(i =>
  30. data.push(this.columns.map(c => i[c.index as string])),
  31. );
  32. this.xlsx.export({
  33. sheets: [
  34. {
  35. data: data,
  36. name: 'sheet name',
  37. },
  38. ],
  39. });
  40. }
  41. }

API

LazyService

成员说明类型默认值
import(fileOrUrl: File | string)导入Excel,返回 JSONPromise<{ [key: string]: any[][] }>-
export(options: XlsxExportOptions)导出ExcelPromise<void>-

XlsxExportOptions

成员说明类型默认值
[sheets]数据源{ [sheet: string]: WorkSheet } | XlsxExportSheet[]-
[filename]Excel文件名stringexport.xlsx
[opts]Excel写入选项,见 WritingOptionsWritingOptions-
[callback]保存前触发(wb: WorkBook) => void-

xlsx

xlsx 指令。

  1. <div [xlsx]="XlsxExportOptions">导出</div>

常见问题

csv格式

文件编码格式必须是 UTF8 with BOM 才能解析。