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]]))

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

    }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容