前端自定义导出Excel

import FileSaver from 'file-saver';
import XLSX from 'xlsx';

function exportExcel(_dataSource) {
  var wopts = {
    bookType: 'xlsx',
    bookSST: true,
    type: 'binary'
  };
  var workBook = {
    SheetNames: ['Sheet1'],
    Sheets: {},
    Props: {}
  };

  let dataSource = [{ 暂无数据: '暂无数据' }];
  const tabelName = _dataSource.tabelName ? _dataSource.tabelName : 'sheet';
  let tableTitle = [];
  if (_dataSource.tableTitle) {
    tableTitle = Object.keys(_dataSource.tableTitle);
  }
  if (_dataSource.arr.length) {
    // {code: value} 变 {汉字: value}
    dataSource = _dataSource.arr.map(item => {
      const obj = {}
      tableTitle.forEach(k => {
        obj[_dataSource.tableTitle[k]] = item[k]
      })
      return obj;
    })
  }
  workBook.Sheets['Sheet1'] = XLSX.utils.json_to_sheet(dataSource);
  // workBook.Sheets['Sheet1']['!cols'] = [{ width: 8 }] // 宽度设置 2 ~=一个汉字
  FileSaver.saveAs(new Blob([changeData(XLSX.write(workBook, wopts))], { type: 'application/octet-stream' }), tabelName + '.xlsx')

}

function changeData(s) {
  // 如果存在ArrayBuffer对象(es6) 最好采用该对象
  if (typeof ArrayBuffer !== 'undefined') {
    // 1、创建一个字节长度为s.length的内存区域
    var buf = new ArrayBuffer(s.length);

    // 2、创建一个指向buf的Unit8视图,开始于字节0,直到缓冲区的末尾
    var view = new Uint8Array(buf);

    // 3、返回指定位置的字符的Unicode编码
    for (var 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;
  }
}

export default exportExcel

使用

// const column = [{ label: '项目编码', prop: 'projectCode' }, { label: '项目名称', prop: 'projectName' }, { label: '台区名称', prop: 'courtsName' }]
import exportExcel from '@/utils/exportExcel';
handleExport() {
   const tableTitle = {}
   column.forEach(item => {
     tableTitle[item.prop] = item.label
   })
   exportExcel({
     tabelName: `核减物资`,
     tableTitle,
     arr: this.tableList
   })
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值