vue导入导出excel

#博学谷IT学习技术支持#

目录

1.实现excel导入

2.实现excel导出


1.实现excel导入

async success({ header, results }) {

      // 如果是导入员工

        const userRelations = {

          '入职日期': 'timeOfEntry',

          '手机号': 'mobile',

          '姓名': 'username',

          '转正日期': 'correctionTime',

          '工号': 'workNumber'

        }

        const arr = []

      results.forEach(item => {

          const userInfo = {}

          Object.keys(item).forEach(key => {

            userInfo[userRelations[key]] = item[key]

          })

        arr.push(userInfo)

        })

        await importEmployee(arr) // 调用导入接口

        this.$router.back()

    }

逻辑判断

async success({ header, results }) {

      if (this.type === 'user') {

        const userRelations = {

          '入职日期': 'timeOfEntry',

          '手机号': 'mobile',

          '姓名': 'username',

          '转正日期': 'correctionTime',

          '工号': 'workNumber'

        }

        const arr = []

        // 遍历所有的数组

        results.forEach(item => {

        // 需要将每一个条数据里面的中文都换成英文

          const userInfo = {}

          Object.keys(item).forEach(key => {

          // key是当前的中文名 找到对应的英文名

            if (userRelations[key] === 'timeOfEntry' || userRelations[key] === 'correctionTime') {

              userInfo[userRelations[key]] = new Date(this.formatDate(item[key], '/')) // 只有这样, 才能入库

              return

            }

            userInfo[userRelations[key]] = item[key]

          })

          // 最终userInfo变成了全是英文

          arr.push(userInfo)

        })

        await importEmployee(arr)

        this.$message.success('导入成功')

      }

      this.$router.back() // 回到上一页

    },

    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.实现excel导出

首先安装依赖

npm install xlsx file-saver -S

npm install script-loader -S -D

由于js-xlsx体积还是很大的,导出功能也不是一个非常常用的功能,所以使用的时候建议使用懒加载。使用方法如下:

import('@/vendor/Export2Excel').then(excel => {

  excel.export_json_to_excel({

    header: tHeader, //表头 必填

    data, //具体数据 必填

    filename: 'excel-list', //非必填

    autoWidth: true, //非必填

    bookType: 'xlsx' //非必填

  })

})

excel导出参数的介绍

vue-element-admin提供了导出的功能模块,在课程资源/excel导出目录下,放置到src目录下

excel导出基本的结构

因为数据中的key是英文,想要导出的表头是中文的话,需要将中文和英文做对应

// 导出excel数据

    exportData() {

      //  做操作

      // 表头对应关系

      const headers = {

        '姓名': 'username',

        '手机号': 'mobile',

        '入职日期': 'timeOfEntry',

        '聘用形式': 'formOfEmployment',

        '转正日期': 'correctionTime',

        '工号': 'workNumber',

        '部门': 'departmentName'

      }

      // 懒加载

      import('@/vendor/Export2Excel').then(async excel => {

        const { rows } = await getEmployeeList({ page: 1, size: this.page.total })

        const data = this.formatJson(headers, rows)

        excel.export_json_to_excel({

          header: Object.keys(headers),

          data,

          filename: '员工信息表',

          autoWidth: true,

          bookType: 'xlsx'

        })

        // 获取所有的数据

        // excel.export_json_to_excel({

        //  header: ['姓名', '薪资'],

        //  data: [['张三', 12000], ['李四', 5000]],

        //  filename: '员工薪资表',

        //  autoWidth: true,

        //  bookType: 'csv'

        // })

      })

    },

    // 该方法负责将数组转化成二维数组

    formatJson(headers, rows) {

      // 首先遍历数组

      // [{ username: '张三'},{},{}]  => [[’张三'],[],[]]

      return rows.map(item => {

        return Object.keys(headers).map(key => {

          if (headers[key] === 'timeOfEntry' || headers[key] === 'correctionTime') {

            return formatDate(item[headers[key]]) // 返回格式化之前的时间

          } else if (headers[key] === 'formOfEmployment') {

            var en = EmployeeEnum.hireType.find(obj => obj.id === item[headers[key]])

            return en ? en.value : '未知'

          }

          return item[headers[key]]

        }) // => ["张三", "13811","2018","1", "2018", "10002"]

      })

      // return data

      // return rows.map(item => {

      //  // item是对象  => 转化成只有值的数组 => 数组值的顺序依赖headers  {username: '张三'  }

      //  // Object.keys(headers)  => ["姓名", "手机号",...]

      //  return Object.keys(headers).map(key => {

      //    return item[headers[key]]

      //  }) // /  得到 ['张三',’129‘,’dd‘,'dd']

      // })

    }

导出时间格式的处理

formatJson(headers, rows) {

      return rows.map(item => {

        // item是一个对象  { mobile: 132111,username: '张三'  }

        // ["手机号", "姓名", "入职日期" 。。]

        return Object.keys(headers).map(key => {

          // 需要判断 字段

          if (headers[key] === 'timeOfEntry' || headers[key] === 'correctionTime') {

            // 格式化日期

            return formatDate(item[headers[key]])

          } else if (headers[key] === 'formOfEmployment') {

            const obj = EmployeeEnum.hireType.find(obj => obj.id === item[headers[key]])

            return obj ? obj.value : '未知'

          }

          return item[headers[key]]

        })

        // ["132", '张三’, ‘’,‘’,‘’d]

      })

      // return rows.map(item => Object.keys(headers).map(key => item[headers[key]]))

      // 需要处理时间格式问题

    }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容