实现excel导入后的数据处理

299 阅读1分钟

目标

数据格式转换:将excel解析好的数据经过处理后,转成可以传给接口调用的数据。

因为excel里大多数数据是中文,例如表头等。 所以需要我们前端需要将数据转换成English~ 转换成可以发送给后端的数据。

处理内容

  • 处理内容包含:字段中文转英文。excel中读入的是姓名,而后端需要的是username
  • 日期处理。从excel中读入的时间是一个number值,而后端需要的是标准日期。

为什么需要处理日期?

excel的日期是以1900-1-0开始计算的,既1900-1-1就是1天,而js的Date是以 1970-1-1 08:00:00 开始的 excel时间换算如下:

解决日期问题的处理思路:

用1970-1-1减去1900-1-1得到的相差处理

封装一个方法并导出,代码如下:

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

字段中文转英文 及 日期处理问题

/**
     * results excel表格的内容
      // [
          {'姓名':'小张', '手机号': '13712345678'}
        , {.....}
        ]

      // 目标
      // [ {'username':'小张','mobile': '13712345678'}, {.....} ]
     */
    // 把一个对象数组中的每个对象的属性名,从中文改成英文
    // 思路:对于原数组每个对象来说
    //    (1) 找出所有的中文key
    //     (2)  得到对应的英文key
    //     (3)  拼接一个新对象: 英文key:值
    
    handleSuccess ({ results} ) {
      const mapInfo = {
        '手机号': 'mobile',
        '姓名': 'username',
        '工号': 'workNumber',
        入职日期: 'timeOfEntry'
      }
    const newResults = results.map((item) => {
    const obj = {}  //定义一个空对象, 重新定义数组中的每一项
    const chkeys = Object.keys(mapInfo) //['手机号', '姓名', '工号', '入职日期']
    chkeys.forEach((key) => {
     const enKey = mapInfo[key]  //重新定义数组中的每一项的值
     
     // 解决excel时间转换问题 使用上面导出的方法formatExcelDate, 使用前记得需引入该方法
     if (enKey === 'timeOfEntry'){
     obj[enKey] = new Date(formatExcelDate(item[key]))
     } else { 
        obj[enKey] = item[key] 
       }
    }
      })
       return obj
    })
   }