vue3+elementUiPlus表格导出功能

1.下载需要的组件包

npm install file-saver xlsx

2.页面中导入

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

 3.页面中的表格加一个id

<el-table
        :data="tableData"
        ref="multipleTableRef"
        style="width: 100%"
id="my-table">

        为了方法连接

4. 导出按钮

<el-button type="primary" icon="download" @click="exportClick ">导出</el-button>

 5.导出方法

const exportClick = () => {
  var table = document.querySelector('#my-table');
  // 复制表格,不包括第一列和最后一列
  var clonedTable = table.cloneNode(true);
  clonedTable.querySelectorAll('tr').forEach(row => {
    var cells = row.cells;
    if (cells.length > 0) {
      // 删除每行的第一个单元格
      row.deleteCell(0);
      // 删除每行的最后一个单元格
      row.deleteCell(cells.length - 1);
    }
  });
  // 创建一个新的工作簿
  var wb = XLSX.utils.book_new();
  // 创建一个新的工作表
  var ws = XLSX.utils.table_to_sheet(clonedTable);
  // 调整每列的列宽以适应内容
  autoSizeColumns(ws);

  // 将工作表添加到工作簿中
  XLSX.utils.book_append_sheet(wb, ws, 'Sheet1');

  // 导出工作簿
  const wbout = XLSX.write(wb, {
    bookType: 'xlsx',
    bookSST: true,
    type: 'binary',
    cellStyles: true, // 启用单元格样式
  });
  try {
    FileSaver.saveAs(new Blob([s2ab(wbout)], { type: 'application/octet-stream' }), '客户表.xlsx');
  } catch (e) {
    if (typeof console !== 'undefined') console.log(e, wbout);
  }
};

6.将字符串转为数组

// 将字符串转换为字节数组
function s2ab(s) {
  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;
}

7.计算最大列宽

function autoSizeColumns(ws) {
  const range = XLSX.utils.decode_range(ws['!ref']);
  for (let C = range.s.c; C <= range.e.c; ++C) {
    let maxColWidth = 0;
    for (let R = range.s.r; R <= range.e.r; ++R) {
      const cellAddress = { c: C, r: R };
      const cellRef = XLSX.utils.encode_cell(cellAddress);
      const cell = ws[cellRef];
      if (cell && cell.v) {
        const cellText = cell.w || cell.v.toString();
        const cellWidth = cellText.length + 2; // 加 2 以适应列头和数据
        if (cellWidth > maxColWidth) {
          maxColWidth = cellWidth;
        }
      }
    }
    const colWidth = maxColWidth > 20 ? maxColWidth : 20; // 设置最小列宽
    const col = ws['!cols'][C];
    if (col) {
      col.wch = colWidth;
    } else {
      ws['!cols'][C] = { wch: colWidth };
    }
  }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值