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 };
    }
  }
}
相关推荐
福兮说4 小时前
设计稿是 #4A7C6F,页面量出来是 #4B7C6F:HEX、HSL、透明度、canvas 来回转的七个坑
前端·javascript·css·canvas
郑州光合科技余经理4 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
专业程序开发源5 小时前
springboot简历管理系统81389-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·php·课程设计
专业程序开发源5 小时前
springboot社区养老系统44071-计算机课程设计、毕业设计
vue.js·spring boot·后端·python·django·php·课程设计
小呆呆6665 小时前
副业搞起来,小说,漫画,漫剧的成本优化思路
前端·后端·面试
凤城老人5 小时前
从 PyQt6 到 Electron:给 Edge TTS 做一个“多角色配音机“的踩坑手记
javascript·typescript·electron
Dovis(誓平步青云)5 小时前
浇水提醒刚弹出又消失,植物状态别只存一个百分比
开发语言·前端·javascript·pdf·ecmascript·电脑
码艺-Alimjan6 小时前
Vben Admin 新增维吾尔语 Vben-Modal的关键坑之一
前端·javascript·vue.js
可乐鸡翅yeah_7 小时前
hls.js 手动自定义 http 请求 loader,修改请求头实战
开发语言·前端·javascript·网络协议·http·ecmascript·m3u8在线
IT_陈寒7 小时前
Vite静态资源导入这个坑我帮你们踩过了
前端·人工智能·后端