导入导出(分为前端实现或后端实现,公司里主要以后端实现为主,前端请求接口,配合后端接口)
导出
1.导出
首先需要下载
cnpm install --save xlsx file-saver//该插件用来实现本地导出xlsx,excel等表格
//如果是本地下载模板则直接下载已经创建好的table表格数据
exportexcel() {
-----------------------------------------------------------------------------------------
//如果后端给你导出路径了就需要在这里加一个请求,首先在data中顶一个list
this.list=await this.$get({
url:'http://120.53.31.103:84/api/user?page=1&limit=10&status=&nickname=&mobile=&',
type:'get'
}).then(res=>{
this.list=res.data.data.list
//将获取到的数据放到list中,将list方法渲染到表格中在导出,导出的时候需要在方法前加async在请求路径前加await,因为如果不加该方法,表格会在数据请求时就进行下载表格,所以必须要现货区数据进行渲染后才可以进行导出摸板。
})
-------------------------------------------------------------------------------------------
// 定义xlsx文件的名字
let name = '学生信息收集表'
//console.log(name)
//选择要导出的表格
var wb = XLSX.utils.table_to_book(document.querySelector(表格类名));//用来和页面的表格进行绑定
var wbout = XLSX.write(wb, {
// 文件类型
bookType: "xlsx",
bookSST: true,
type: "array"
});
console.log(wbout)
try {
// name+'.xlsx'表示导出的excel表格名字
// 将原生字符串转换为Uint8Array的数组,然后再通过FileSaver保存到文件
FileSaver.saveAs(
new Blob([wbout], { type: "application/octet-stream" }),
name + ".xlsx"
);
} catch (e) {
if (typeof console !== "undefined") console.log(e, wbout);
}
return wbout;
},
写本地导出的时候需要用到此方法,同时我们需要在当前页面上创建一个表格,用来作为导出的数据
<table class="table" v-show="false">
<tr>
<td>序号</td>
<td>姓名</td>
<td>电话号码</td>
</tr>
<tr>
<td>1</td>
<td>小明</td>
<td>18238561667</td>
</tr>
</table>
需要给他定义一个类名,因为本地导出的方法中他是根据寻找类名的方法来找到要导出的表格的
var wb = XLSX.utils.table_to_book(document.querySelector(表格类名));
该方法和表格类名绑定后直接调用该方法就可以下载xlsx表格
详见(本地导出)
2.下载模板
后端导出相对于前端导出简单很多
直接请求后端给的路径就可自动下载
var url = "'后端提供的接口'/download/udi-import-template.xlsx"
window.open(url, '_blank')
//后端导出可以直接进行请求该路径进行下载xlsx文件
导入
可以使用element-ui进行该操作,因为在进行表格传输的时候一般传输的都为二进制数据(需要用到FromData()方法),那么我们可以运用element-ui封装好的组件进行数据转换和传输
代码为
<el-upload
class="upload-demo"
action="http://120.53.31.103:84/api/import/user"//该路径为要传输的地址
:headers="token"//设置头部token如果请求不需要token也可以不写
:file-list="fileList">
<el-button size="small" type="primary">点击上传</el-button>
</el-upload>
因为传输的数据位fromdata数据,但element-ui已将将该方法封装好,直接上传即可
上传实现原理-H5中的FromData
fromdata是将数据转换为二进制的数据
在fromdata对象中的方法有
FormData {}
>__proto__: FormData
>append: ƒ append()
>delete: ƒ delete()
>entries: ƒ entries()
>forEach: ƒ forEach()
>get: ƒ ()
>getAll: ƒ getAll()
>has: ƒ has()
>keys: ƒ keys()
>set: ƒ ()
>values: ƒ values()
>constructor: ƒ FormData()
>Symbol(Symbol.iterator): ƒ entries()
Symbol(Symbol.toStringTag): "FormData"
>__proto__: Object
我们用的时候首先需要初始化一个fromdata对象
var fromdata=new FromData{}
//因为fromdata中有append方法即我们可以使用append来进行数据拼接
fromdata.append('name','小明')
//如果我们直接log该fromdata输出为fromdata{}里面没有数据,如果需要里面的数据则需要调用fromdata的get数据
fromdata.get('name')
//在fromdata中第一个值看可以理解为key值,这个key值可以有很多个值,我们可以给name这个key值传输好多歌之,但调用get方法只能获取第一个值,如果需要显示所有的则需要用到getAll()方法
fromdata.getAll('name')
//我们也可以通过fromdata.delete(key值)来进行删除
fromdata.delete('name')
批量导出
在vue的vue复选框的表格中,在表格内有两个方法select和selectAll方法select方法有两个参数,第一个参数是一个数组,内容为你所有选中的对象,选中几个在这个数组中就有几个对象,第二个参数为你选中的当前对象,把第一个参数拿到,直接渲染到xlsx方法绑定的table表格中,然后将这个表格到处就好
selectAll方法有一个参数,就是选中的所有对象,选中所有后,拿到这个数组,渲染表格导出
首先要引进插件
import FileSaver from "file-saver";
import XLSX from "xlsx";
<el-table
:data="stu_list"
border
-----------------------------------
@select='xz'
@select-all='xzAll'
//调用这两个方法,拿到数据
---------------------------------
style="width: 100%">
<el-table-column
type="selection"
width="55">
</el-table-column>
<el-table-column
fixed
prop="nickname"
label="学生名称"
width="300">
<template slot-scope="scope">
<img :src="scope.row.avatar" alt="" class="img">
{{scope.row.nickname}}
</template>
</el-table-column>
<el-table-column
prop="mobile"
label="手机号"
width="200">
</el-table-column>
<el-table-column
label="状态"
width="200">
<template slot-scope="scope">
<span v-if="scope.row.status==0">禁用</span>
<span v-else>启用</span>
</template>
</el-table-column>
<el-table-column
prop="created_at"
label="创建时间"
width="120">
</el-table-column>
<el-table-column
label="操作"
width="300">
<template slot-scope="scope">
<el-button @click="handleClick(scope.row.uid)" type="text" size="small">详情</el-button>
<el-button type="text" size="small" @click="up(scope.row.uid)">编辑</el-button>
<el-button type="text" size="small" v-show="scope.row.status==1" @click="Disable(scope.row.uid)">禁用</el-button>
<el-button type="text" size="small" v-show="scope.row.status==0" @click="upDisable1(scope.row.uid)">启用</el-button>
<el-button type="text" size="small" @click="remove(scope.row.uid)">删除</el-button>
<el-button type="text" size="small" @click="resPass(scope.row.uid)">重置密码</el-button>
</template>
</el-table-column>
</el-table>
xz(x,y){
console.log(x,y);
this.aa=x
},
xzAll(x){
console.log(x);
this.aa=x
},
//讲方法赋值到aa数组里面
//批量导出调用导出方法
<el-button type="primary" size="small" @click="exportexcel" >批量导出</el-button>
//在这里将拿到的aa渲染到该表格
<table class="table" v-show="false">
<tr style="width:200px;">
<td>序号</td>
<td>姓名</td>
<td>电话号码</td>
</tr>
<!-- 动态渲染 -->
<tr style="text-align:center;" v-for="(item,index) in aa" :key="index">
<td style="width:200px;text-align:center;">{{index+1}}</td>
<td style="width:200px;text-align:center;">{{item.nickname}}</td>
<td style="width:200px;text-align:center;">{{item.mobile}}</td>
</tr>
</table>
//方法
exportexcel() {
// 定义xlsx文件的名字
let name = '学生信息收集表'
//console.log(name)
//选择要导出的表格
var wb = XLSX.utils.table_to_book(document.querySelector(".table"));
var wbout = XLSX.write(wb, { //excel配置
// 文件类型
bookType: "xlsx",
bookSST: true,
type: "array"
});
wbout.style='text-align:center'
console.log(wbout)
try {
// name+'.xlsx'表示导出的excel表格名字
// 将原生字符串转换为Uint8Array的数组,然后再通过FileSaver保存到文件
FileSaver.saveAs(
new Blob([wbout], { type: "application/octet-stream" }),
name + ".xlsx"
);
} catch (e) {
if (typeof console !== "undefined") console.log(e, wbout);
}
return wbout;
},
导出还有一种简单的方法,但它只能导出固定的文件
在public文件夹中创建一个xlsx文件
在页面写
<a href="/aa.xlsx" download="下载">下载</a>
点击该链接即可下载创建在public中的xlsx文件