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.导出方法

javascript 复制代码
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.将字符串转为数组

javascript 复制代码
// 将字符串转换为字节数组
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.计算最大列宽

javascript 复制代码
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 };
    }
  }
}
相关推荐
以对_11 分钟前
uview表单校验不生效问题
前端·uni-app
Zheng1131 小时前
【可视化大屏】将柱状图引入到html页面中
javascript·ajax·html
程序猿小D1 小时前
第二百六十七节 JPA教程 - JPA查询AND条件示例
java·开发语言·前端·数据库·windows·python·jpa
john_hjy1 小时前
【无标题】
javascript
奔跑吧邓邓子2 小时前
npm包管理深度探索:从基础到进阶全面教程!
前端·npm·node.js
软件开发技术深度爱好者2 小时前
用HTML5+CSS+JavaScript庆祝国庆
javascript·css·html5
前端李易安2 小时前
ajax的原理,使用场景以及如何实现
前端·ajax·okhttp
汪子熙2 小时前
Angular 服务器端应用 ng-state tag 的作用介绍
前端·javascript·angular.js
杨荧2 小时前
【JAVA开源】基于Vue和SpringBoot的旅游管理系统
java·vue.js·spring boot·spring cloud·开源·旅游
Envyᥫᩣ3 小时前
《ASP.NET Web Forms 实现视频点赞功能的完整示例》
前端·asp.net·音视频·视频点赞