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

这篇具有很好参考价值的文章主要介绍了el-table实现纯前端导出(适用于el-table任意表格)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

1.安装三个插件

npm install file-save

npm install xlsx

npm install xlsx-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>

4.vue.config.js引入

  //在这个方法里面
  configureWebpack: {
    name: name,
    resolve: {
      alias: {
        '@': resolve('src')
      }
    },
    plugins: [
      // http://doc.ruoyi.vip/ruoyi-vue/other/faq.html#使用gzip解压缩静态文件
      new CompressionPlugin({
        cache: false,                   // 不启用文件缓存
        test: /\.(js|css|html)?$/i,     // 压缩文件格式
        filename: '[path].gz[query]',   // 压缩后的文件名
        algorithm: 'gzip',              // 使用gzip压缩
        minRatio: 0.8                   // 压缩率小于1才会压缩
      })
    ],


    //加入这三行
    externals: [{
      './cptable': 'var cptable'
    }]



  },

效果:

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

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

当我们会出现这样的表格需求时,如果只是用v-if判断,导出来会全部也有,因为我们只做了v-if的判断

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

实现代码如下:

<span v-if="index===0">{{scope.row.xxxx}}</span>//如果是第一行就显示值
<span v-else></span>//如果不是就为空

这样就可以防止只需要第一个行数据的时候其他还会显示的问题。文章来源地址https://www.toymoban.com/news/detail-688406.html

到了这里,关于el-table实现纯前端导出(适用于el-table任意表格)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【前端】vue3+ts+vite,el-table表格渲染记录重复情况

    给自己一个目标,然后坚持一段时间,总会有收获和感悟! 在使用vue的过程中,总会遇到一些有疑问的地方,总结就能够加深印象,下次再出现的时候也有个参考的地方。 Element UI 的 el-table 组件是一个强大的表格组件,提供了许多常见的属性来配置和定制表格的外观和行为

    2024年02月04日
    浏览(51)
  • vue纯前端导入excel,获取excel的表格数据渲染el-table

    最近有个需求,最开始列表数据是通过新增按钮一条条添加的,但是部分数据量可能上百条,客户自己手选会很慢,所以产品经理给了个需求要求可以通过上传excle文件进行导入。 经过网上查询及涉及自己项目,实现了此功能。 第一步:安装插件,我安的是0.16.0;原因是默认

    2024年02月16日
    浏览(54)
  • el-table实现嵌套表格的展示

    需求 一个表单中存在子表 列表返回格式 实现 实现思路 el-table中在嵌套一个el-table,这样数据格式就没问题了,主要就是样式 将共同的列放到一列中,通过渲染自定义表头 render-header ,将表头按照合适的宽度渲染出来 根据数据渲染表头 调样式,慢慢调到合适就行 完整代码

    2024年02月21日
    浏览(46)
  • el-table表格实现自动滚动效果

    table页面的内容如果超出设定的height会出现自动无限滚动的效果,如下所示: 先给el-table一个ref属性 然后获取到这个属性 在mounted阶段执行scrollFun函数,通过setTnterval定时器来实现动态滚动效果,代码如下: 如果出现列表字段过长时,可使用tooltip-effect=“dark” 搭配 show-overf

    2024年02月13日
    浏览(41)
  • 【前端vue+elemenui】el-table根据表格数据设置整行样式或单元格样式

    首先需要了解俩个函数,row-class-name、cell-class-name 这里以cell-class-name单元格样式为例 row-class-name 行的 className 的回调方法,也可以使用字符串为所有行设置一个固定的 className。 Function({row, rowIndex})/String cell-class-name 单元格的 className 的回调方法,也可以使用字符串为所有单元

    2024年01月24日
    浏览(53)
  • vue3中el-table实现表格合计行

    el-table标签上加属性 show-summary :summary-method=“getSummary” js中添加函数(合计没有额外的附件参数添加) js中添加函数(合计有额外的附件参数添加的情况)

    2024年02月02日
    浏览(51)
  • 表格(el-table)里面嵌套表格(el-table)

    样式如下:   用到的代码: 一般需要嵌套表格这种情况下,后端返回的都是字符串格式的数组,需要在接收到数据后自己转化,编辑好提交的时候也需要自己把数组转为字符串格式传给后端. 一般在涉及到嵌套表格的情况下,新增或者编辑某条记录的时候,都会有动态增加或者删除一

    2024年02月15日
    浏览(39)
  • 【Vue/element】 el-table实现表格动态新增/插入/删除 表格行,可编辑单元格

    效果如下: 点击“新增一行”可以在表格最后新增一行,单元格内容可编辑 点击绿色+按钮,可在指定行的后面插入一行 点击红色-按钮,可以删除指定行 原理:表格 el-table 是通过动态循环 tableData 生成,只要对 tableData 数组进行增加删除元素,就可以达到效果 这里用了ele

    2024年02月16日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包