Angular + xlsx + xlsx-js-style实现多个sheel页Excel下载

需求:前端实现将后台返回的数组数据转化为多页excel,并自定义样式

使用组件

1、xlsx
2、xlsx-js-style(官方:https://www.npmjs.com/package/xlsx-js-style)

xlsx这个插件可以把html中的table元素或者json数据转换成表格后进行导出

常用方法参数说明
book_new-创建一个空的book
table_to_booktable元素(dom)将table元素转换成 book
table_to_sheettable元素(dom)将table元素转换成 sheet
json_to_sheetjson数据(数组)将json数据转换成 sheet
book_append_sheet参数1:book对象,参数2:sheet对象,参数3:sheet名称将sheet添加到book中
writeFile参数1:book对象,参数2:导出的文件名称导出表格文件

本来准备使用 xlsx-style,但引入会报很多错,找到xlsx-js-style组件代替,使用方法相同

一、安装依赖

npm install xlsx --save
npm install file-saver --save
//样式组件
npm install xlsx-js-style

二、代码

//html
<button (click)="handleOk()">下载</button>

//ts
import * as XLSX from 'xlsx/xlsx.mjs';
var FileSaver = require('file-saver');
import * as XLSXStyle from 'xlsx-js-style';

// 下载excel
  exportFile(): void {
    //生成excel表的数据[{},...{}],每个对象代表一行,key值代表列名
    let json1: any = []
    //数组
    this.DataArr1.forEach(arr => {
      json1.push({
        "id": arr.Id,
        "code": arr.Code,
        "type": arr.Type,
      })
    })
    let json2: any = []
    this.DataArr2.forEach(arr => {
      json2.push({
        "id": arr.Id,
        "code": arr.Code,
        "type": arr.Type,
      })
    })
    const worksheet1: XLSX.WorkSheet = XLSX.utils.json_to_sheet(json1,);
    const worksheet2: XLSX.WorkSheet = XLSX.utils.json_to_sheet(json2,);
    //设置自定义样式
    this.setExlStyle(worksheet1);
    this.setExlStyle(worksheet2);
    const workbook: XLSX.WorkBook = {
      Sheets: { '页面1': worksheet1, "页面2": worksheet2},
      SheetNames: ['页面1', '页面2']
    };
    const excelBuffer: any = XLSXStyle.write(workbook, { bookType: 'xlsx', type: 'array' });
    //转成二进制流
    const data: Blob = new Blob([excelBuffer], {
      type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8'
    });
    FileSaver.saveAs(data, '文件名' + new Date().toLocaleDateString() + '.xls');
  }


//设置自定义样式
setExlStyle(data) {
    data["!cols"] = [];
    for (let key in data) {
      if (data[key] instanceof Object) {
        if (key === 'A1' || key === 'B1' || key === 'C1' || key === 'D1' || key === 'E1' || key === 'F1' || key === 'G1') {
          data[key].s = {
            // 字体
            font: {
              name: 'Microsoft YaHei UI',
              sz: 10,
              color: { rgb: "ffffff" },
              bold: true
            },
            alignment: {
              vertical: 'center',
              horizontal: 'center',
            },
            fill: {
              fgColor: { rgb: "298103" },
            },
          }
        } else {
          data[key].s = {
            // 字体
            font: {
              name: 'Microsoft YaHei UI',
              sz: 10,
            },
            alignment: {
              vertical: 'center',
              horizontal: 'left',
            },
          }
        }
      }
      data["!cols"].push({ wpx: 115 });
    }
    return data;
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
当然可以,以下是一个简单的使用 Angular 实现功能的例子: 首先,安装 ngx-pagination 库,这是一个方便的 Angular插件。 ``` npm install ngx-pagination --save ``` 接下来,在需要分的组件中导入 ngx-pagination: ```typescript import { NgModule } from '@angular/core'; import { NgxPaginationModule } from 'ngx-pagination'; @NgModule({ imports: [ NgxPaginationModule ] }) ``` 在组件类中定义一个数组来存储所有要展示的数据: ```typescript export class MyComponent { data = [ { id: 1, name: 'John' }, { id: 2, name: 'Jane' }, { id: 3, name: 'Bob' }, { id: 4, name: 'Alice' }, { id: 5, name: 'Jim' }, { id: 6, name: 'Mary' }, { id: 7, name: 'Tom' }, { id: 8, name: 'Lucy' }, { id: 9, name: 'David' } ]; } ``` 在组件模板中,使用 ngx-pagination 指令来实现: ```html <table> <thead> <tr> <th>ID</th> <th>Name</th> </tr> </thead> <tbody> <tr *ngFor="let item of data | paginate: { itemsPerPage: 3, currentPage: p }"> <td>{{item.id}}</td> <td>{{item.name}}</td> </tr> </tbody> </table> <pagination-controls (pageChange)="p = $event"></pagination-controls> ``` 在上述模板中,我们使用了 *ngFor 指令来循环渲染每一的数据,同时使用了 paginate 指令来进行分。其中,itemsPerPage 表示每显示几条数据,currentPage 表示当前码。而 pagination-controls 是 ngx-pagination 提供的组件,用来实现控件。 好了,这样就实现了一个简单的 Angular功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钥零零

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值