zoukankan      html  css  js  c++  java
  • 2021-10-15 纯前端实现导出excel表格功能

    场景描述:

          由于 el-table 表格展示的数据是存在storage中且要在表格的操作栏添加一个导出按钮,所以这个功能只能由纯前端的方式来实现

    <el-table
    ref="table"
    :data="dataTable"
    hightlight-current-row
    border
    height="calc(100vh - 360px)"
    @selection-change="selectChangeData"
    >
    <el-table-column align="center" type="selection" width="60" />
    <el-table-column align="center" label="序号" width="60">
    <template slot-scope="scope">
    <span>{{ scope.$index + 1 }}</span>
    </template>
    </el-table-column>
    <el-table-column align="center" label="操作" width="300">
    <template slot-scope="scope">
    <el-button type="text" @click.native.prevent="handleDel(scope.row, scope.$index, dataTable)">删除</el-buttom>
    <el-button type="text" @click.native.prevent="exportExcel(scope.row)">导出</el-button>
    </template>
    </el-table-column>

    <template v-for="(item, index) in tableHeaders">
    <el-table-column v-if="item.visible" :key="index" show-overflow-tooltip align="center">
    // 这里是table的header栏 - 带搜索框或者下拉选择框的
    <template slot="header" slot-scope="scope">
    <div :key="scope.$index">{{ tableHeaders[index].label }}</div>
    <template v-if="item.queryType === 'input'">
    <el-input v-model="form[item.queryProperty]" :placeholder="'请输入' + item.label"/>
    </template>
    <template v-else-if="item.queryType === 'select'">
    <el-select v-model="form[item.queryProperty]" placeholder="请选择">
    <el-option label="全部"></el-option>
    <el-option v-for="_item in item.list" :key="_item.value" :label="_item.label" :value="_item.value"></el-option>
    </el-select>
    </tempalte>
    </template>

    <template>
    <span>{{item.formatter ? item.formatter(scope.row[item.prop]) : scope.row[item.prop]}}</span>
    </template>
    </el-table-column>
    </template>

    </el-table>


    <script>
    export default{
    data(){
    return {
    tableHeaders:[
    {
    label:'姓名',
    prop:'name',
    visible: true,
    120
    queryType: 'input'
    },
    {
    label:'性别',
    prop:'gender',
    visible: true,
    120,
    queryType:'select',
    queryProperty: 'gender',
    list: [
    {value:'0', label:'未知'},
    {value:'1', label:'男'},
    {value:'2', label:'女'}
    ]
    formatter:(row)=>{
    // 假设数据返回 0 ,1 , 2这种,就需要转换成 男,女,未知, 就可以使用这种方法
    const gender = row.gender;
    const val = this.list.find((item) => item.value === gender.toString())
    return val ? val : '--';
    }
    },
    {
    label:'年龄',
    prop:'age',
    visible:true,
    120,
    queryType:'',
    }
    ]
    }
    },
    methods:{
    handleDel(row, index, dataTable){
    this.$confirm('是否删除',{
    confirmButtonText:'确定',
    cancelButtonText:'取消',
    type:'warning'
    }).then(()=>{
    dataTable.splice(index, 1);
    // 然后该存储就存储
    this.$message({
    type:'success',
    message:'删除成功'
    })
    })
    },
    exportExcel(row){
    let str = `姓名, 性别, 年龄, 职业, 籍贯, 爱好, 身高... `;
    // 这一步的操作是因为 row 这行数据中有很多字段,然后这些字段我们并不需要也不用展示到页面上的。
    const info = {
    name: row.name || '--',
    gender: row.gender ? this.handleGenderType(row.gender) : '--', // 这一步是为了把数据 0,1,2置换成对应的值 未知,男,女。
    age: row.age || '--',
    ... // 只取自己需要的字段
    }
    Object.keys(info).forEach(key => {
    str += `${info[key]} ,`;
    })

    const url = `data:text/xlsx;charest=utf-8,ufeff${encodeURIComponent(str)}`;
    // 通过a标签实现
    const link = document.createElement('a');
    link.href = url;
    // 对下载的文件命名
    link.download = '导出文件名称.xlsx';
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
    },
    // 处理枚举类型对应的值
    handleGenderType(genderType){
    const genderTypeObj = ['未知','男','女'];
    return genderTypeObj[genderType];
    }
    }
    }
    </script>

    ok~~~, 到此,这个导出功能就完成啦~又get到了一个新技能,哈哈哈哈

    参考链接:

           https://www.pianshen.com/article/505822742/

    如果快乐太难,那祝你平安。
  • 相关阅读:
    ORM中介模型 + auth模块(用户登录校验)
    ModelForm
    Form组件------注册
    信贷相关业务
    pymongo
    开发者工具使用
    kindeditor文字编辑器 文章点赞评论操作
    VS Code:设置多行注释快捷键
    Nodejs:npm run build之后,distindex.html页面在火狐中可以正常显示登录页面并登录成功,在Chrome中可以正常显示登录页面,登录失败
    Maven:项目结构
  • 原文地址:https://www.cnblogs.com/sunnyeve/p/15411094.html
Copyright © 2011-2022 走看看