el-table实现纯前端导出(适用于el-table任意表格)

news2025/1/16 17:05:55

2023.9.1今天我学习了如何使用el-table实现前端的导出功能,该方法的好处有无论你的el-table长什么样子,导出之后就是什么样子。

1.安装三个插件

npm install file-save

npm install xlsx

npm install xlx-style

2.创建Export2Excel.js

// 根据dom导出表格
import { saveAs } from 'file-saver'
import * as XLSX from 'xlsx'
import * as XLSXStyle from "xlsx-style";

function s2ab(s) {
  var buf = new ArrayBuffer(s.length);
  var view = new Uint8Array(buf);
  for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
  return buf;
}

export function exportToExcel(idSelector, fileName, titleNum = 1) {
  // 设置导出的内容是否只做解析,不进行格式转换     false:要解析, true:不解析
  const xlsxParam = { raw: true }
  let table = document.querySelector(idSelector).cloneNode(true)
  // 因为element-ui的表格的fixed属性导致多出一个table,会下载重复内容,这里删除掉
  if (table.querySelector('.el-table__fixed-right')) {
    table.removeChild(table.querySelector('.el-table__fixed-right'))
  }
  if (table.querySelector('.el-table__fixed')) {
    table.removeChild(table.querySelector('.el-table__fixed'))
  }

  const wb = XLSX.utils.table_to_book(table, xlsxParam)
  let range = XLSX.utils.decode_range(wb.Sheets['Sheet1']['!ref'])
  let cWidth = []
  for (let C = range.s.c; C < range.e.c; ++C) {   //SHEET列
    let len = 100 //默认列宽
    let len_max = 400 //最大列宽
    for (let R = range.s.r; R <= range.e.r; ++R) {  //SHEET行
      let cell = { c: C, r: R }                    //二维 列行确定一个单元格
      let cell_ref = XLSX.utils.encode_cell(cell)  //单元格 A1、A2
      if (wb.Sheets['Sheet1'][cell_ref]) {
        // if (R == 0){
        if (R < titleNum) {
          wb.Sheets['Sheet1'][cell_ref].s = {  //设置第一行单元格的样式 style
            alignment: {
              horizontal: 'center',
              vertical: 'center'
            }
          }
        } else {
          wb.Sheets['Sheet1'][cell_ref].s = {
            alignment: {
              horizontal: 'center',
              vertical: 'center'
            }
          }
        }
        //动态自适应:计算列宽
        let va = JSON.parse(JSON.stringify(wb.Sheets['Sheet1'][cell_ref].v))
        var card1 = JSON.parse(JSON.stringify(va)).match(/[\u4e00-\u9fa5]/g) //匹配中文
        var card11 = ''
        if (card1) {
          card11 = card1.join('')
        }
        var card2 = JSON.parse(JSON.stringify(va)).replace(/([^\u0000-\u00FF])/g, '')  //剔除中文
        let st = 0
        if (card11) {
          // st += card11.length * 16  //中文字节码长度
          st += card11.length * 20  //中文字节码长度
        }
        if (card2) {
          // st += card2.length * 8  //非中文字节码长度
          st += card2.length * 10  //非中文字节码长度
        }
        if (st > len) {
          len = st
        }
      }
    }
    if (len > len_max) {//最大宽度
      len = len_max
    }

    cWidth.push({ 'wpx': len })     //列宽
  }
  wb.Sheets['Sheet1']['!cols'] = cWidth
  const wbout = XLSXStyle.write(wb, { bookType: 'xlsx', bookSST: false, type: 'binary' })
  try {
    saveAs(new Blob([s2ab(wbout)], { type: '' }), `${fileName}.xlsx`)
  } catch (e) {
    if (typeof console !== 'undefined') {
      console.log(e, wbout)
    }
  }
  return wbout
}

3.按需引入

<template>
    <div>
      <el-table  id='table'>
        //形式一
        <el-table-column>
         <template>
           <span>可以用插槽形式</span>
         </template>
        </el-table-column>
     
        //形式二
        <el-table-column lable=可以用这种形式' prop='xxx'/>
     
        //形式三(不可用)
        <el-table-column>
          <template>
            <el-input  v-model=''/>//该方式无法识别到
          </template>
        </el-table-column>

     </el-table>//给表格一个id
      <el-button @click='demo'>导出</el-button>
    </div>
</template>

<script>
import { exportToExcel } from '@/Export2Excel'

export default{
  data(){
    return{}
 },
  methods:{
      demo(){
        exportToExcel('#table', '导出名称')//id选择器,导出名称,调用这个方法就可以了
      }
  }
}
</script>

效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/960456.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows右键添加用 IDEA 打开

1.安装IDEA时 安装时会有个选项来添加&#xff0c;如下&#xff1a; 勾选即可 2.修改注册表 安装时未勾选&#xff0c;可以把下面代码中程序路径改为自己的&#xff0c;保存为对应的 idea.reg文件&#xff0c;双击即可 Windows Registry Editor Version 5.00[HKEY_CLASSES…

问题记录:jenkins添加节点时Launch method没有Launch agents via SSH选项

jenkins问题记录 在jenkins主页&#xff0c;左侧点击Manage Jenkins&#xff0c;找到plugins选项&#xff0c;搜索如下插件安装&#xff1a; 安装完插件后&#xff0c;即可看到ssh选项出来了

2023开学礼《乡村振兴战略下传统村落文化旅游设计》西学图灵许少辉八一新书

2023开学礼《乡村振兴战略下传统村落文化旅游设计》西学图灵许少辉八一新书

Linux工具

一、yum yum可以看作一个客户端&#xff08;应用商店&#xff09;、应用程序&#xff0c;它如何知道去哪里下载软件&#xff1f; yum也是一个指令/程序&#xff0c;可以找到它的安装路径。 在list中可以看到yum能安装的所有软件&#xff0c;通过管道找到想要的&#xff0c;yum …

ChatGPT 总结前端HTML, JS, Echarts都包含哪些内容

AIGC ChatGPT ,BI商业智能, 可视化Tableau, PowerBI, FineReport, 数据库Mysql Oracle, Office, Python ,ETL Excel 2021 实操,函数,图表,大屏可视化 案例实战 http://t.csdn.cn/zBytu

数据视觉化探秘:了解有效传达的几种常见图表

当涉及向观众传达复杂的数据时&#xff0c;数据可视化图表成为了无价的工具。本文为大家介绍几种常用的数据可视化图表&#xff0c;以便更好地展示和理解数据。 折线图 这是最基础的图表类型之一&#xff0c;通过连续的折线连接数据点&#xff0c;呈现数据随时间或顺序的变化…

极米投影仪好用吗?极米RS Pro 3的真实体验效果怎么样?

随着智能投影仪的不断普及&#xff0c;现在大多数的年轻家庭在布局客厅的时候也不再以传统的电视为主&#xff0c;投影仪代替电视已然成为了一种常态&#xff0c;投影仪的体积更小、不用固定安装、也不会占用太大的空间&#xff0c;并且可以随意投射出百寸以上的画面大小&#…

《论文阅读21》Equivariant Multi-View Networks

一、论文 研究领域&#xff1a;计算机视觉 | 多视角数据处理中实现等变性论文&#xff1a;Equivariant Multi-View Networks ICCV 2019 论文链接视频链接 二、论文简述 在计算机视觉中&#xff0c;模型在不同视角下对数据&#xff08;例如&#xff0c;点云、图像等&#xff0…

XXE漏洞利用技巧(由简入深)-----portswigger(XXE部分WP)

什么是XXE XXE&#xff08;XML External Entity&#xff1a;xml外部实体注入&#xff09;&#xff0c;它出现在使用XML解析器的应用程序中。XXE攻击利用了XML解析器的功能&#xff0c;允许应用程序从外部实体引用加载数据。攻击者可以通过构造恶意的XML实体引用来读取本地文件…

四、MySql数据类型

文章目录 一、数据类型&#xff08;一&#xff09;数据类型分类&#xff08;二&#xff09;数值类型1、tinyint类型2、bit类型3、小数类型&#xff08;1&#xff09; float&#xff08;2&#xff09;decimal 4、字符串类型&#xff08;1&#xff09;char&#xff08;2&#xff…

101序列检测器

本次所做设计&#xff0c;使用数字电路芯片实现的101序列检测器。电路图如下&#xff1a; 主要首先要根据需求画出状态转移方程&#xff0c;然后写出它的逻辑表达式。最后根据所选触发器种类确定电路图。序列由按键控制输入&#xff0c;按键按下&#xff0c;代表输入1 &#xf…

如何使用Python和正则表达式处理XML表单数据

在日常的Web开发中&#xff0c;处理表单数据是一个常见的任务。而XML是一种常用的数据格式&#xff0c;用于在不同的系统之间传递和存储数据。本文通过阐述一个技术问题并给出解答的方式&#xff0c;介绍如何使用Python和正则表达式处理XML表单数据。我们将探讨整体设计、编写思…

交换机和路由器互联,并用ACL进行网段隔离的实例

拓朴如下&#xff1a; vlan10 20 为业务网段&#xff0c;vlan100为管理网段 S1起了vlan10 20&#xff0c;上行接口起了trunk口 S2起了vlan 10 20 100&#xff0c;分别起了vlanif网关&#xff0c;其中 vlanif 100是100.1.1.2/30&#xff0c;下行配置为trunk&#xff0c;起了AC…

Mysql索引、事务、函数

索引&#xff1a; 索引&#xff0c;使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。 在关系数据库中&#xff0c;索引是一种与表有关的数据库结构&#xff0c;它可以使对应于表的SQL语句执行得更快。索引的作用相当于图书的目录…

新的雅思口语6分标准

目录 新的雅思口语6分标准 要有细节&#xff0c;要有充分的话题词汇资源 要拥有具象思维能力&#xff0c;要有画面感 下义词是什么意思&#xff1f; 方法&#xff1a;现在时未来时 &#xff08;形成时态多样&#xff09;观点解释 原因要有排他性 "Kick off" 是…

国家公派必读|CSC奖学金发放/专用银行卡领取说明/问题解答

在上期文章“国家公派必读|CSC各类留学人员奖学金资助和艰苦地区补贴标准”的基础上&#xff0c;本文知识人网小编谈谈奖学金的具体发放办法、CSC奖学金专用银行卡及领取奖学金说明及有关问题解答。 奖学金发放 1. 留学基金委在取得留学服务机构的派出信息后为留学人员预发3个…

QT(9.1)对话框与事件处理

作业&#xff1a; 1. 完善登录框 点击登录按钮后&#xff0c;判断账号&#xff08;admin&#xff09;和密码&#xff08;123456&#xff09;是否一致&#xff0c;如果匹配失败&#xff0c;则弹出错误对话框&#xff0c;文本内容“账号密码不匹配&#xff0c;是否重新登录”&…

【kubernetes】k8s部署APISIX及在KubeSphere使用APISIX

Apache APISIX https://apisix.apache.org/ 功能比nginx-ingress更强 本文采用2.5.0版本 https://apisix.apache.org/zh/docs/apisix/2.15/getting-started/ 概述内容来源于官方&#xff0c;学习于马士兵云原生课程 概述 Apache APISIX 是什么&#xff1f; Apache APISIX 是 …

前端JS学习(一)

基础 JavaScript书写位置 1、行内 JavaScript   通常放在文档结尾的 < / b o d y > </body> </body> 上面   将 < s c r i p t > <script> <script>放在HTML文件的底部附近是因为浏览器会按照代码在文件中的顺序加载HTML。 2、内部J…

解决在写论文过程中遇到的插入到论文中的图片不清晰的问题(全网最详细最全解决方法)

目录 1 插入到word中的图片不清晰 2 将word转化为pdf以后图片不清晰 3 在利用latex写作过程中得到的pdf图片不清晰 4 将位图转换为矢量图 在读论文的过程中其实我们可以发现很多论文的插图在放大以后是模糊的&#xff0c;这是因为他们所插入的并不是矢量图。 矢量图&#x…