前端导出表格,万级数据,带样式(留自用)

本文介绍如何在前端实现万级数据的Excel导出,并保持样式。首先,推荐使用xlsx版本0.16.3和file-saver库。接着,导入Blob.js、Export2Excel.js和dateUtil.js三个JS文件。在主文件中调用相关函数进行导出操作。对于万级数据,需要分批次发送请求,并在等待期间显示loading组件。最后,为了导出带样式的表格,还需引入xlsx-style插件,解决可能出现的报错问题。
摘要由CSDN通过智能技术生成

普通excel 导出

1.下载插件 (推荐版本xlsx0.16.0)

//建议安装 0.16.3 的xlsx,高版本的好像会有问题 "file-saver": "^2.0.2", "xlsx": "^0.16.3"

 npm  install  -S file-saver
 npm install xlsx@0.16.0 -S 
 npm  install  -D script-loader

2.导入三个js文件

在src目录下新建utils文件夹,里面放入Blob.js和Export2Excel.js和dateUtil.js三个JS文件

 3.mian.js(两个js文件再文章末尾)

import Blob from './utils/Blob'

import Export2Excel from './utils/Export2Excel.js'

4.导出

html:


<el-button class="purple el-icon-upload2" @click="exportExcel()">导出</el-button>

js:

注: 当前表格为复选表格,所以对复选进行了相应判断

//引入  注意Export2Excel路径
import { export_json_to_excel } from '../../../utils/Export2Excel';  
import dateUtil from '../../../utils/dateUtil'

// 导出
		exportExcel() {
			const tHeader = ["竞赛名称", "竞赛开始时间","竞赛结束时间","得分","排名","获得奖项","指导老师","指导老师获得奖项"]; //对应表格输出的title
			const filterVal = ["rname", "starttime","endtime","mark","type","sprizename","teacher","tprizename"]; // 对应表格输出的数据
			let that = this;
			this.$confirm('确定要导出吗?', '提示', {
				type: 'warning'
			}).then(() => {
				// console.log(this.multipleSelection,'---');
				// 如果选择数据为空 发送请求 取全部数据
				if(this.multipleSelection == undefined || this.multipleSelection == '') {  
					//total为后端返回数据总条数,直接赋值给当前页面请求条数即可
                    this.form.pagesize = this.pageTotal  
					//this.query为请求需要携带的参数
                    this.query = this.form  
                    //schoollist为封装后的请求
					schoollist(this.query).then(res => {
						that.exportData = res.retData.data;
                        //为循环数据添加一个序号 导出后方便查看
						for(let i in that.exportData){
							that.exportData[i].type = parseInt(i)+1
						}
						const data = that.formatJson(filterVal, that.exportData);
						export_json_to_excel(tHeader, data, '人员历史参赛' + dateUtil.gettime() + '系统导出');//最后一个是表名字
                        //请求完成后将页码归为正常请求值
						that.form.pagesize = 10
					});
				}else {
                    //如果此时复选框有数据,直接导出选中数据即可
					this.exportData = this.multipleSelection
					const data = that.formatJson(filterVal, this.exportData);
					export_json_to_excel(tHeader, data, '人员历史参赛' + dateUtil.gettime() + '系统导出');//最后一个是表名字 
                    //导出完成后,清除复选框数据
					this.$refs.table.clearSelection()
					this.multipleSelection = []
				}

				// console.log('导出数据',this.exportData);
				
				
			}).catch(()=>{})
		},
formatJson(filterVal, jsonData) {   
			return jsonData.map(v => filterVal.map(j => v[j]))    
		},

5.导出万级数据(普通一次性导出失败,需要对请求进行处理)

思路: 和普通导出一样 只不过是将请求分批次发送, 再服务器可接收的范围内即可

        由于等待时间过长,需要加入loading图,此时可以将loading进行封装,方便其他页面使用

5-1 loading组件

可以将其放到公用的文件夹中

<template>
    <div class="loading">
        <div>
            <img class="loadimg" src="../../assets/img/loading.gif" alt="">
            <p class="loadtext">正在导出中,请稍后</p>
        </div>
    </div>
</template>

<script>
export default {
  name: 'Loading' // 定义的组件名称 使用时写法:loading
}
</script>

<style scoped>

.loading {
    /* background: rgba(0,0,0,.3);
    position: fixed;
    top: 70px;
    right: 0;
    width: 83.4%;
    height: 100%;
    padding-top: 18%;
    z-index: 1000; */
    display: flex;
    justify-content: center;
    align-items: center;
    background: rgba(0,0,0,.3);
    position: absolute;
    top: 0;
    right: 0;
    width: 100%;
    height: 100%;
    z-index: 10;
}
.loadimg {
    margin: auto;
    width: 44px;
    display: block;
}
.loadtext {
    line-height: 32px;
    /* color: #2c3e50; */
    color: #FCFCFC;
}
</style>

5-2.当前页面引入loading 

//html
<!-- 加载loading -->
        <div id="loading">
            <Loading ref='loading' v-if="loading"></Loading>
        </div>
//js
	import Loading from '../../common/loading.vue'     //loading图

export default {
		
		components:{
			Loading,
		},
        data() {
			return {
				loading:false,
            }
        }
}

5-3 发起数据请求 导出excel

重复之前步骤

引入需要的插件

//html:
<el-button class="purple el-icon-upload2" @click="exportdownload()">导出</el-button>
//js:
import { export_json_to_excel } from '../../../utils/Export2Excel';
import dateUtil from '../../../utils/dateUtil'
//事件 前提同样是复选表格 所以进行判断
//判断默认全部导出还是选择后部分导出
			exportdownload() {
				let that = this;
				this.$confirm('确定要导出吗?', '提示', {
					type: 'warning'
				}).then(() => {
					//未选择数据 默认导出全部
					if(this.multipleSelection.length == 0) {   
						this.form.pagenum = 0 
                        //数据处理
					
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值