在做人力资源管理的后台项目时,实现了excel表的导入导出功能。用到了vue-element-admin提供的框架(链接地址 ),我们只需要在自己的项目中封装改造即可。
下面,来讲一下在项目中实现excel表的导入与导出的步骤。
xlsx
,所以需要安装xlsx
插件npm i xlsx
(为了让我们的项目每次跳转都跳转到一个统一的页面,我们的项目中封装了单独的路由和页面组件@/views/import/index.vue来放excel导入)
注意:这个页面结构用到了element-ui框架,但是如果用的是其他框架只需要改页面结构,逻辑代码是通用的。
@/components/UploadExcel/index.vue
代码到链接中复制即可,要改动的只有页面结构和样式。(代码地址)
在我们的import/index.vue组件中,传给UploadExcel/index.vue一个onsuccess方法,在这个方法里面我们可以拿到excel表的header表头和results表格数据。拿到这些数据就可以根据我们的业务需求来转换数据,来实现我们的业务需求逻辑代码。
拿到的数据大概是如下这种:
// 拿到的数据是如下这种,我们要将它转化成我们请求接口中所需要的数据
console.log(header)
// ["手机号", "姓名", "入职日期", "转正日期", "工号", ...]
console.log(results)
// [{入职日期: 'xxx', 姓名: 'xxx', 工号: 'xxx', ...}, {入职日期: 'xxx', 姓名: 'xxx', 工号: 'xxx', ...}]
// 我们需要的数据是如下这种
// [{timeOfEntry: 'xxx', username: 'xxx', workNumber: 'xxx', ...}, {timeOfEntry: 'xxx', username: 'xxx', workNumber: 'xxx', ...}]
下面附上整个代码:
Excel 的导入导出都是依赖于js-xlsx来实现的。
在 js-xlsx
的基础上又封装了Export2Excel.js来方便导出数据。所以我们可以先下载该js文件到我们的项目目录下(链接地址)
src/vendor/Export2Excel.js
由于 Export2Excel
不仅依赖js-xlsx
还依赖file-saver
和script-loader,所以我们要再下载两个依赖包。
npm install xlsx file-saver -S
npm install script-loader -S -D
由于下载的Export2Excel.js文件还挺大的,我们可以用按需导入的方法导入到我们的组件中。然后调用导入文件的导出对象上的方法,这个方法需要我们传入一些参数。
// 懒加载
import('@/vendor/Export2Excel').then(excel => {
// excel是引入文件(也就是@/ventor/Export2Excel)的导出对象
excel.export_json_to_excel({
header: tHeader, // 表头 必填 []
data, // 具体数据 必填 [[], [], ...]
filename: 'excel-list', // 导出文件名 非必填
autoWidth: true, // 单元格是否要自适应宽度 非必填 true / false
bookType: 'xlsx' // 导出文件类型 非必填 'xlsx'/'csv'/'txt'等
})
})
在导出的函数我们,我们需要将我们项目中拿到的数据转化成参数所需要的数据格式
// 拿到的数据是这种
// [{ username: 'xxx', mobile: 'xxx', ... }, { username: 'xxx', mobile: 'xxx', ... }]
// 要转化的是如下这种
// header: ['姓名', '手机号', '入职日期', ...]
// data: [['张三', '138xxxxxxxx', '1992-08-04', ...], ['李四', '135xxxxxxxx', '1992-08-04', ...]]
下面附上整个代码
// 导出数据
exportData() {
// 1.定义表头对应关系
const headers = {
'姓名': 'username',
'手机号': 'mobile',
'入职日期': 'timeOfEntry',
'聘用形式': 'formOfEmployment',
'转正日期': 'correctionTime',
'工号': 'workNumber',
'部门': 'departmentName'
}
// 懒加载
import('@/vendor/Export2Excel').then(async excel => {
// excel是引入文件(也就是@/ventor/Export2Excel)的导出对象
// 获取所有的数据
const { rows } = await getEmployeeList({ page: 1, size: this.page.total })
const data = this.formatJson(headers, rows) // 返回的data就是我们转化后的数据
excel.export_json_to_excel({
// 要求转出的表头是中文
header: Object.keys(headers), // 表头 必填
data, // //具体数据 必填
filename: 'excel-list', // 非必填
autoWidth: true, // 非必填
bookType: 'xlsx' // 非必填
})
// 拿到的数据是这种
// [{ username: 'xxx', mobile: 'xxx', ... }, { username: 'xxx', mobile: 'xxx', ... }]
// 要转化的是如下这种
// header: ['姓名', '手机号', '入职日期', ...]
// data: [['张三', '138xxxxxxxx', '1992-08-04', ...], ['李四', '135xxxxxxxx', '1992-08-04', ...]]
})
},
formatJson(headers, rows) {
return rows.map(item => {
console.log(item)
return Object.keys(headers).map(k => {
if (headers[k] === 'timeOfEntry' || headers[k] === 'correctionTime') {
return formatDate(item[headers[k]]) // 返回格式化之前的时间
} else if (headers[k] === 'formOfEmployment') {
return EmployeeEnum.hireType[item.formOfEmployment] ? EmployeeEnum.hireType[item.formOfEmployment] : '未知'
}
return item[headers[k]]
})
})
}
好啦,以上就是excel表导入导出的步骤啦,有不对的地方欢迎指正哦!~