angular2 + XLSX 导出一张工作簿中包含多张表格

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33455771/article/details/80930074

1、安装xlsx包(我使用的npm安装的

npm install xlsx

2、使用

    (1)在你需要导出的页面的  .ts 中引入相关的file.service.ts文件

        import {FileService} from '../../../file.service'; ===》这个文件的作用就如同它的名字一样是为表格服务的

    (2)依赖注入


    (3)导出文件

        关于导出表格的数据什么的我就不进行详细的赘述了,主要是调用你封装在 file.service.ts 中的 multiDownLoadExl() 函数,这个函数的是我们自己写的。里面的参数根据的你的需要来添加,下面只有我需要使用的参数。


         下面我会对里面用到的参数进行一一的讲解

            that.selectedAllAlarmList ===> 这个是我们需要导出的数据,数据是一个JSON数组的格式:

                JSON数组中的一个大数组 [  ] 代表一个表格,大数组中的 { } 代表一行数据

            that.selectedAllAlarnList = {

                '001': [ 

                    {'目录': ' 1 ',  '名称': ' 1 ',  '说明': ' 1 ' }, 

                    {'目录': ' 1 ',  '名称': ' 1 ',  '说明': ' 1 ' }

                    {'目录': ' 1 ',  '名称': ' 1 ',  '说明': ' 1 ' }

                   ], 

                '002': [ 

                    {'目录': ' 1 ',  '名称': ' 1 ',  '说明': ' 1 ' }, 

                    {'目录': ' 1 ',  '名称': ' 1 ',  '说明': ' 1 ' }

                    {'目录': ' 1 ',  '名称': ' 1 ',  '说明': ' 1 ' }

                   ], 

            '003': [ 

                    {'目录': ' 1 ',  '名称': ' 1 ',  '说明': ' 1 ' }, 

                    {'目录': ' 1 ',  '名称': ' 1 ',  '说明': ' 1 ' }

                    {'目录': ' 1 ',  '名称': ' 1 ',  '说明': ' 1 ' }

                   ]

            }

        fillName ===》就是你导出的工作簿的名字(就是文件名)

        longestList ===》这是我们根据需要设置的单元格列宽,因为导出的表格的宽度都是默认的,不符合我的要求。

            要记住单元格的宽度是一个一个单元格设置的。一个行单元格的宽度一个数组。根据我的实践证明,设置宽度的几个变量只有

        wch有效,wch代表多少个字符。

            格式:

                    longestList  = {

                            '001':  [ { wch: 15 } ,{ wch: 15 },{ wch: 15 } ]

                             '002':  [ { wch: 15 } ,{ wch: 15 },{ wch: 15 } ]

                             '003':  [ { wch: 15 } ,{ wch: 15 },{ wch: 15 } ]

                       }

    rowPropList ===》这是我们根据需要设置的单元格列高,因为导出的表格的高度都是默认的,不符合我的要求。
    rowPropList 的格式跟longestList  是一样的。要求跟设置列宽也差不多。
mergesList ===》 这个参数是是用来设置你需要合并单元格的。
    s =>是起始单元格;e => 是结束单元格;c => 是第几行;r => 是第几列
    格式:
 
 
 merges = [
  {s: {c: 0, r: 0}, e: {c: 3, r: 0}},
  {s: {c: 0, r: 3}, e: {c: 3, r: 3}},
  {s: {c: 0, r: 4}, e: {c: 3, r: 4}}
];
sheetNames ===》这个参数是用来设置sheetName的,一个sheetName代表一个表格,就是下面这个东西 :
格式:
sheetNames  = [ 'sheet1','sheet2' ,'sheet3' ]
以上是我对函数中需要使用的参数的一个解释说明,接下来我对我的multiDownLoadExl函数继续解说:
    下面就是我写的函数:
            
multiDownLoadExl(dataAll, fileName, colProp, rowProp, merges, sheetNames) {

  let i = 0;
  const wb: XLSX.WorkBook = {SheetNames: sheetNames, Sheets: {}, Props: {}};
  for (const item in dataAll) {
    const toSet = XLSX.utils.json_to_sheet(dataAll[item], {skipHeader: true});
    wb.Sheets[sheetNames[i]] = toSet; // 通过json_to_sheet转成单页(Sheet)数据
    const wsname: string = wb.SheetNames[i];
       const ws: XLSX.WorkSheet = wb.Sheets[wsname];
       ws['!cols'] = colProp[item]; //单元格宽度
    ws['!rows'] = rowProp[item]; //列高
    ws['!merges'] = merges[item]; //合并单元格
    i++;
  }
  fileName += '.' + this.wopts.bookType;
  this.saveAs(
    new Blob([this.s2ab(XLSX.write(wb, {bookType: 'xlsx', bookSST: false, type: 'binary'}))], {type: ''}), fileName);
}
     因为这是一个工作簿中包含多个表格,因此需要进行一个for循环,记住JSON数组的for循环是用
for...in..
    
XLSX.utils.json_to_sheet ===》将JSON数组转换为表格格式;
skipHeader ===》 表格是否需要标题,根据自己的需求而定;
saveAs函数:
// saveAs调用在本地机器上下载文件
saveAs(obj, fileName) {//当然可以自定义简单的下载文件实现方式
  const tmpa = document.createElement('a');
  tmpa.download = fileName || '下载';
  tmpa.href = URL.createObjectURL(obj); //绑定a标签
  tmpa.click(); //模拟点击实现下载
  setTimeout(function () { //延时释放
    URL.revokeObjectURL(obj); //URL.revokeObjectURL()来释放这个object URL
  }, 100);
}
s2ab() 函数:
        // 字符串转字符流
    s2ab(s) {
      // console.log(s);
      if (typeof ArrayBuffer !== 'undefined') {
        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;
      } else {
        const buf = new Array(s.length);
        for (let i = 0; i !== s.length; ++i) {
          buf[i] = s.charCodeAt(i) & 0xFF;
        }
        return buf;
      }
    }
 
  

建议:

    参考xlsx的官网文档使用

    xlsx-style用于设置xlsx表格的样式的。

提示:

(1)cell.s无效(也就是说通过cell.s来设置表格的相关字体样式无效)

(2)在fill.service.ts中记得引入xlsx ==》 import * as XLSX from 'xlsx';

xlsx官网地址:https://www.npmjs.com/package/xlsx

xlsx-style官网地址:https://www.npmjs.com/package/xlsx-style

 
  

猜你喜欢

转载自blog.csdn.net/qq_33455771/article/details/80930074