excel的导入和导出

 

 

 

员工的导入

员工导入组件封装

1.获取封装组件 : 代码地址:https://github.com/PanJiaChen/vue-element-admin/blob/master/src/components/UploadExcel/index.vue

2.安装xlsx插件:npm i xlsx

3.注册全局导入excel组件:install(Vue){ Vue.component('xxx',xxx)}

4.修改样式和布局(在最下面)

 

一,建立公共导入的页面路由

1.挂载路由

2.创建路由组件

 

二,分析excel导入代码,封装接口

对外通过props传入了两个方法:

   props: {

     beforeUpload: Function, 

     onSuccess: Function

   },

1.结构中有带file属性的input标签,处于隐藏状态,并绑定了ref属性,其中accept属性只能传入.xlsx和.xls文件,并绑定了change事件

2.上传按钮绑定了点击事件,通过$refs调用了input标签的点击事件

3.当input标签传入文件时,通过事件参数e.target.files判断是否有该文件

4.如果有改文件,该组件中封装的方法会将文件中的数据读取解析成两个中文数组,其中一个为标题组成的数组header,另一个为数据对象组成数组results

5.当传入的onSuccess函数存在时,{header,results}两个数组会当做参数传入onSuccess函数

6.封装批量导入员工数据的接口,传入的参数必须为数组类型

 

三,实现excel导入

目标:将results 数组对象中的中文键值转化为英文,在导入接口渲染数据

1.在需导入页面中定义onSuccess( { header, results } )函数

2.定义results中中文键值和所对应英文的对应关系对象,例如:obj= {'中文': '英文'...}

3.将results数组通过map遍历出里面的对象,再将对象通过Object.keys(xxx)方法将其中的中文键给遍历出来,再遍历出obj中的英文和results 中的值,定义一个空对象arr,通过arr[英文] = results 中的值进行赋值,return arr,因map会新返回一个数组,声明一个新数组newArr接收

4.将封装好的批量导入员工数据的接口引入,并将newArr传入

5.数据导入之后,通过this.$router.back()和$router.back('/import')进行路由切换

 

四,解决导入时间问题

1.定义一个日期格式的转换方法

formatDate(numb, format) { const time = new Date((numb - 1) * 24 * 3600000 + 1) time.setYear(time.getFullYear() - 70) const year = time.getFullYear() + '' const month = time.getMonth() + 1 + '' const date = time.getDate() - 1 + '' if (format && format.length === 1) { return year + format + month + format + date } return year + (month < 10 ? '0' + month : month) + (date < 10 ? '0' + date : date) }

2.arr数组进行赋值时判断英文值是否为入职日期或转正日期

3.符合条件new Date(formatDate(值,‘/’)),只有new一个Date才能导入

 

 

员工的导出

excel导出参数的介绍和所需依赖和按需加载

1.安装依赖:

npm install xlsx file-saver -S

npm install script-loader -S -D

2.在 js-xlsx的基础上又封装了Export2Excel.jshttps://github.com/PanJiaChen/vue-element-admin/blob/master/src/vendor/Export2Excel.js来方便导出数据

3.给导出按钮绑定点击事件

4.使用懒加载导入封装的Export2Excel.js(为promise对象),通过.then引入数据中的export_json_to_excel方法,传入参数

5.传入的参数介绍

参数

说明

类型

可选值

默认值

header (主要)

导出数据的表头

Array

/

[]

data (主要)

导出的具体数据

Array

/

[[]]

filename

导出文件名

String

/

excel-list

autoWidth (默认可不写)

单元格是否要自适应宽度

Boolean

true / false

true

bookType (默认可不写)

导出文件类型

String

xlsx, csv, txt, more

xlsx

 

excel导出的基本结构

目标:将原数据结构[{ name: 'zs', age: '18'...}...] 转化为 [[zs,18...]...],要求转出的标题是中文

1.和导入一样定义一个中英文对应的键值对对象headers{'姓名': 'username',....}

2.使用Object.keys(headers)将值传入参数header中

3.获取所有员工数据,将之前获取接口中传入page:1,和size:this.page.total总数,得到所有员工数据rows

4.封装一个数据结构转化的方法,将所有员工数据rows和headers当参数传入,方法中将rows.map遍历出{英文:数据}的对象,再将Object.keys(headers)通过map把对应的中文遍历出来,通过数组层层嵌套从而得到数据值,由于map方法会形成一个新的数据,用retun层层返回能够得到 [[zs,18...]...]的数据结构,最后将调用函数赋值给参数data

 

导出时间格式处理

1.引入原先filters过滤器文件夹中时间格式化方法

2.判断遍历出来的数据是否为入职日期和转正日期,如果是则将时间数据格式化

 

聘用形式格式化处理

目标:将聘用形式数据中的1或0转化为正式或非正式

1.引入枚举数据文件夹

2.判断遍历出来的数据是否为聘用形式

3.符合条件则利用find方法将枚举中的数据遍历,判断枚举数据中的id是否等于数据中的值,如果是则返回枚举数据中的value,否则返回未知

 

复杂表头的导出

vue-element-admin 提供的导出方法中有 multiHeader和merges 的参数

参数

说明

类型

可选值

默认值

multiHeader

复杂表头的部分

Array

/

[[]]

merges

需要合并的部分

Array

/

[]

1.multiHeader中的一行表头中的字段的个数需要和真正的列数相等,假设想要跨列,多余的空间需要定义成空串,它主要对应的是标准的表头

2.我们要实现其合并的效果, 需要设定merges选项,例如:[['A1:A2', 'B1:F1', 'G1:G2']]

 

 

修改的样式和布局:

<template>   <div class="upload-excel">     <div class="btn-upload">       <el-button :loading="loading" size="mini" type="primary" @click="handleUpload">         点击上传       </el-button>     </div>     <input ref="excel-upload-input" class="excel-upload-input" type="file" accept=".xlsx, .xls" @change="handleClick">     <div class="drop" @drop="handleDrop" @dragover="handleDragover" @dragenter="handleDragover">       <i class="el-icon-upload" />       <span>将文件拖到此处</span>     </div>   </div> </template>

<style scoped lang="scss"> .upload-excel {   display: flex;   justify-content: center;    margin-top: 100px;    .excel-upload-input{        display: none;         z-index: -9999;      }    .btn-upload , .drop{       border: 1px dashed #bbb;       width: 350px;       height: 160px;       text-align: center;       line-height: 160px;    }    .drop{        line-height: 80px;        color: #bbb;       i {         font-size: 60px;         display: block;       }    } } </style>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值