zoukankan      html  css  js  c++  java
  • element-UI 渲染动态的 prop 和 label 以及导出动态的数据为excel

    注:要想导出execl,首先要先按照模块化工具,我这点就懒得写了,点击链接看这篇文章:https://www.cnblogs.com/tlfe/p/12858991.html

    描述:突然接到一个需求,就是在输入框填写数据库查询语句,然后去数据库拿到想要的数据,在这个情况下:每次查询出来的字段和字段名都不一样,怎么把它对应的显示在el-table上呢,而且还要要导出为表格数据。

    1、实际上查询出来的数据是非常的多的,这点我只显示几条数据,作为演示,可以看到总的数据为 2.7万条,我们只渲染10条在页面上,(此处注意,不能把所有的数据一次性渲染在页面上)当然不怕卡死的可以试试

    2、上面这个图只是最终的演示图,下面看html部分的写法(注意标红的部分)

    <el-table id="table" :data="execlData" border :header-cell-style="{background:'#F8F8FA',color:'#606266',fontSize:'13px',fontWeight:'bold'}">
         <el-table-column v-for="item in tableData" :prop="item" :label="item" :key="item.id" width="160" show-overflow-tooltip align="center"></el-table-column>
    </el-table>

    2-1、我们打印出execlData和tableData的数据,如下图所示

    3、data部分代码

    data() {
        return {
          form: {
            creatorName: "" //搜索条件
          },
          tableData:[], //装表格标题,见上面的图
          execlData: [], //装的是要渲染显示出来的10条数据
          exportData: [], //点击导出的时候,拿到所有的数据放在这里面
        };
      },

    4、js部分

    methods: {
        request() {
          let obj = {
            userId: Number(sessionStorage.getItem("userId")),
            sessionId: sessionStorage.getItem("sessionId"),
            sql: this.form.creatorName //数据库查询语句
          };
          this.$axios.post("/admin/sql/sql", obj).then(res => {
            if (res.errorCode == 200) {
              let array = res.result;
              this.tableData = []; //装的是渲染th用的数据就是 label属性
              this.execlData = [];  //就是渲染在页面上的10条数据
              array.forEach((element, index) => {
                  if(index<1){
                    //   lable
                    for (var key in element) {
                        this.tableData.push(key)
                    }
                  }
                  
                  if(index < 10){
                    this.execlData.push(element)
                  }
              });
              console.log(this.tableData,'this.tableData')
              console.log('--------------------------------------------------------')
              console.log(this.execlData,'this.execlData')
            }else{
              loot.Messages(this,'error','数据查询失败!')
            }
          });
        },
        
        formatJson(filterVal, jsonData) {
          return jsonData.map(v => filterVal.map(j => v[j]));
        },
    
        // 点击导出的函数
        exportExcel() {
            this.$axios.post('/admin/sql/sql',{
                userId: Number(sessionStorage.getItem("userId")),
                sessionId: sessionStorage.getItem("sessionId"),
                sql: this.form.creatorName
            }).then(res => {
                if(res.errorCode === 200){
                    this.exportData = []; //初始化装所有数据的容器
                    let array = res.result
                    array.forEach(element => {
                        this.exportData.push(element) //把所有数据放到容器里面
                    });
                    // 导出数据
                    require.ensure([], () => {
                        const { export_json_to_excel } = require('@/vendor/Export2Excel');
    
                        // 这两行代码是正常示例,只是我们这点由于每次查询的数据是变化的,所以需要改动
                        // const tHeader = ['标题', '投稿人', '展示终端', '标签分类',];
                        // const filterVal = ['title', 'nickName', 'show_Terminal', 'tagName'];
                        
                        // 我这点都用this.tableData的原因是,我表格label和对应的prop属性都是一样的。见上面这两行代码
                        const tHeader = this.tableData;  //相当于你table中的label属性
                        const filterVal = this.tableData; //相当于你table中的prop
                        // 上面的id、Name、name是age里对象的属性
                        const list = this.exportData;  //把一次次拿到的数据放到list里面
                        const data = this.formatJson(filterVal, list);
                        export_json_to_excel(tHeader, data, 'excel');
                    })
                }else{
                  loot.Messages(this,'error','导出失败!')
                }
            })
        },
    
        //点击查询的按钮 
        seek() {
          this.request();
        }
      }
  • 相关阅读:
    jquery判断设备是否是手机
    jQuery -- touch事件之滑动判断(左右上下方向)
    sass制作雪碧图
    js时间字符串转为标准时间
    装箱和拆箱
    Dictionary泛型集合实现山寨版金山词霸
    泛型集合
    ArrayList集合与索引器及Hashtable
    黑马程序员--静态方法和静态类
    黑马程序员--多态练习(手机工厂)
  • 原文地址:https://www.cnblogs.com/tlfe/p/12912179.html
Copyright © 2011-2022 走看看