vue项目中如何使用excel导入导出
从vue-element-admin中提供的excel导入功能迁移到当前的项目中
导入
安装依赖
安装插件
npm install xlsx
引入组件
将vue-element-admin提供的组件复制到我们自己的项目 **src/components/UploadExcel **下
注册为全局组件
准备导入页面
新建一个公共的导入页面,import路由组件src/views/import/index.vue
在页面中使用前面封装的excel上传组件,并补充导入成功后的回调函数
<template>
<upload-excel :on-success="handleSuccess" />
</template>
<script>
export default {
name: 'Import',
methods: {
handleSuccess({ header, results }) {
console.log(header, results)
}
}
}
</script>
配置路由
这个路由不需要根据权限控制,也不需要显示在左侧菜单 ,直接定义为静态路由即可。在**src/router/index.js **下的静态路由中添加一个路由
{
path: '/import',
component: Layout,
hidden: true,
children: [{
path: '',
component: () => import('@/views/import')
}]
}
测试路由结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-geLsuA7b-1629724067018)(解决跨域的几种方法.assets/image-20210823205507375.png)]
测试导入效果
handleSuccess({ header, results }) {
console.log(header, results)
}
按要求处理数据
处理内容包含:
- 字段中文转英文。excel中读入的是
姓名 ,而后端需要的是username - 日期处理。从excel中读入的时间是一个number值,而后端需要的是标准日期。
为了方便维护代码,单独封装一个方法来实现这个转换的功能。
transExcel(results) {
const mapInfo = {
'入职日期': 'timeOfEntry',
'手机号': 'mobile',
'姓名': 'username',
'转正日期': 'correctionTime',
'工号': 'workNumber',
'部门': 'departmentName',
'聘用形式': 'formOfEmployment'
}
return results.map(zhObj => {
const enObj = {}
const zhKeys = Object.keys(zhObj)
zhKeys.forEach(zhKey => {
const enKey = mapInfo[zhKey]
enObj[enKey] = zhObj[zhKey]
})
return enObj
})
}
excel数据日期不准确处理
export function formatExcelDate(numb, format = '/') {
const time = new Date((numb - 25567) * 24 * 3600000 - 5 * 60 * 1000 - 43 * 1000 - 24 * 3600000 - 8 * 3600000)
time.setYear(time.getFullYear())
const year = time.getFullYear() + ''
const month = time.getMonth() + 1 + ''
const date = time.getDate() + ''
if (format && format.length === 1) {
return year + format + month + format + date
}
return year + (month < 10 ? '0' + month : month) + (date < 10 ? '0' + date : date)
}
更新格式转换函数
import { formatExcelDate } from '@/utils/index.js'
transExcel(results) {
const mapInfo = {
'入职日期': 'timeOfEntry',
'手机号': 'mobile',
'姓名': 'username',
'转正日期': 'correctionTime',
'工号': 'workNumber',
'部门': 'departmentName',
'聘用形式': 'formOfEmployment'
}
return results.map(zhObj => {
const enObj = {}
const zhKeys = Object.keys(zhObj)
zhKeys.forEach(zhKey => {
const enKey = mapInfo[zhKey]
+ if (enKey === 'timeOfEntry' || enKey === 'correctionTime') {
+ enObj[enKey] = new Date(formatExcelDate(zhObj[zhKey]))
} else {
enObj[enKey] = zhObj[zhKey]
}
})
return enObj
})
}
调用接口读入文件
定义接口api
export function importEmployee(data) {
return request({
url: '/sys/user/batch',
method: 'post',
data
})
}
在页面中使用
导入API
封装doImport
import { importEmployee } from '@/api/employees'
async doImport(data) {
try {
const res = await importEmployee(data)
console.log('importEmployee', res)
this.$message.success('导入成功')
this.$router.back()
} catch (err) {
console.log('importEmployee', err)
this.$message.error('导入失败')
}
},
handleSuccess({ header, results }) {
console.log(header, results)
const data = this.transExcel(results)
console.log('按接口要求 组装数据', data)
this.doImport(data)
}
导出
-
插件包位于src/vendor/export2Excel 中,采用的是按需引入的方式 什么时候正式要使用导出功能了,插件才会被正式引入到应用里 import('@/vendor/Export2Excel').then(excel => {})
-
Export2Excel 依赖的包有js-xlsx 、file-saver 和script-loader 也就是说,在项目跑起来之前要安装依赖 npm install file-saver script-loader --save
将vue-element-admin中的src/vendor/export2Excel复制到项目中,直接使用
给导出注册点击事件
import('@/vendor/Export2Excel').then(excel => {
console.log(excel)
excel.export_json_to_excel({
header: ['姓名', '工资'],
data: [
['刘备', 100],
['关羽', 500]
],
filename: 'excel-list',
autoWidth: true,
bookType: 'xlsx'
})
})
Excel导出参数说明
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|
header | 导出数据的表头 | Array | / | [] | data | 导出的具体数据 | Array | / | [[]] | filename | 导出文件名 | String | / | excel-list | autoWidth | 单元格是否要自适应宽度 | Boolean | true / false | true | bookType | 导出文件类型 | String | xlsx, csv, txt, more | xlsx |
处理数据
formatData(list) {
const map = {
'id': '编号',
'password': '密码',
'mobile': '手机号',
'username': '姓名',
'timeOfEntry': '入职日期',
'formOfEmployment': '聘用形式',
'correctionTime': '转正日期',
'workNumber': '工号',
'departmentName': '部门',
'staffPhoto': '头像地址'
}
console.log(list)
let header = []
let data = []
const one = list[0]
if (!one) {
return { header, data }
}
header = Object.keys(one).map(key => {
return map[key]
})
data = list.map(obj => {
const key = obj['formOfEmployment']
obj['formOfEmployment'] = hireTypEnmu[key]
return Object.values(obj)
})
return { header, data }
},
hExport() {
import('@/vendor/Export2Excel').then(async excel => {
const res = await getEmployee(this.page, this.size)
const list = res.data.rows
console.log('从后端获取的数据', list)
const { header, data } = this.formatData(list)
console.log(header, data)
excel.export_json_to_excel({
header: header,
data: data,
filename: 'excel-list',
autoWidth: true,
bookType: 'xlsx'
})
})
},
|