前言

在日常作期间可能会遇到一些需要利用excel文件批量导入数据的项目,例如在我们管理用户的时候,如果新增用户较多一个个添加用户就会比较麻烦,所以可以自己封装一个可以导入excel表格的组件。使用者只要导入表格,组件会自动根据需要一次性导入多条用户信息。可以一下减轻很多工作量,那么这么好用的组件要怎么封装呢?我整理了一些注意事项,快跟我来一起看看吧


提示:以下是本篇文章正文内容,下面案例可供参考

一、为什么要封装excelu组件,excel组件的作用是什么?

封装这个组件是为了让开发效率变得更快,这个组件是基于xlsx插件进行封装的一个组件,主要用于当我们想快速一次性导入多条数据,并且导入的文件正好是excel格式的时候,就可以使用这个组件。

二、使用步骤(导入)

1.下载安装xlsx包

代码如下(示例):

npm i xlsx 或者 yarn add xlsx

2.封装一个组件

由于类似的功能在vue-element-admin里面已经提供了,所以我们复制已有的代码进行改造,代码地址:代码地址

将vue-element-ui提供导入的功能新建成组件:

import PageTools from './PageTools'
import UploadExcel from './UploadExcel'
export default {install(Vue) {Vue.component('PageTools', PageTools) // 注册工具栏组件Vue.component('UploadExcel', UploadExcel) // 注册导入excel组件}
}

修改一下样,可以按照自己的喜好更改,下面代码仅供参考:

<template><div class="upload-excel"><div class="btn-upload"><el-button :loading="loading" size="mini" type="primary" @click="handleUpload">点击上传</el-button></div><input ref="excel-upload-input" class="excel-upload-input" type="file" accept=".xlsx, .xls" @change="handleClick"><div class="drop" @drop="handleDrop" @dragover="handleDragover" @dragenter="handleDragover"><i class="el-icon-upload" /><span>将文件拖到此处</span></div></div>
</template>
<style scoped lang="scss">
.upload-excel {display: flex;justify-content: center;margin-top: 100px;.excel-upload-input{display: none;z-index: -9999;}.btn-upload , .drop{border: 1px dashed #bbb;width: 350px;height: 160px;text-align: center;line-height: 160px;}.drop{line-height: 80px;color: #bbb;i {font-size: 60px;display: block;}}
}
</style>

3.创建一个路由

{path: '/import',component: Layout,hidden: true, // 隐藏在左侧菜单中children: [{path: '', // 二级路由path什么都不写 表示二级默认路由component: () => import('@/views/import')}]},

4.将封装的组件引入到页面里

<template><upload-excel :on-success="success">
</template>

5.转化导入的数据格式

由于我们后台发请求需要的数据字段是英文的,而我们excel导入的字段是中文,所以需要转化一下:

需要一个数据校验的对象

const userRelations = {'入职日期': 'timeOfEntry','手机号': 'mobile','姓名': 'username','转正日期': 'correctionTime','工号': 'workNumber'}

封装一个方法,进行数据字段的转化

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

由于excel导入数据的时候,时间格式跟我们定义的不一样,转化出来的时间是一个数字,所以需要定义一个处理时间函数的方法

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

逻辑判断代码如下

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

三.基本使用(excel导出)

由于 Export2Excel不仅依赖js-xlsx还依赖file-saverscript-loader

安装导出excel所需要的依赖

npm install xlsx file-saver -S
npm install script-loader -S -D
或者
yarn add xlsx file-saver -S
yarn add script-loader -S -D

相对于导入导出功能不是那么常用所以最好使用懒加载

import('@/vendor/Export2Excel').then(excel => {excel.export_json_to_excel({header: tHeader, //表头 必填data, //具体数据 必填filename: 'excel-list', //非必填autoWidth: true, //非必填bookType: 'xlsx' //非必填})
})

定义一个导出的表头

 const headers = {'手机号': 'mobile','姓名': 'username','入职日期': 'timeOfEntry','聘用形式': 'formOfEmployment','转正日期': 'correctionTime','工号': 'workNumber','部门': 'departmentName'}

调用一下excel.export_json_to_excel方法

excel.export_json_to_excel({header: Object.keys(headers),data,filename: '员工信息表',autoWidth: true,bookType: 'xlsx'

同样的导出excel也需要格式化日期,我使用的是一个过滤器函数,至于如何定义一个过滤器函数可以查看vue的官方文档

四.拓展内容

1.excel导出参数的介绍

参数 说明 类型 可选值 默认值
header 导出数据的表头 Array / []
data 导出的具体数据 Array / [[]]
filename 导出文件名 String / excel-list
autoWidth 单元格是否要自适应宽度 Boolean true / false true
bookType 导出文件类型 String xlsx, csv, txt, more xlsx

2.复杂表头的导出

参数 说明 类型 可选值 默认值
multiHeader 复杂表头的部分 Array / [[]]
merges 需要合并的部分 Array / []
  • multiHeader中的一行表头中的字段的个数需要和真正的列数相等,假设想要跨列,多余的空间需要定义成空串

  • const multiHeader = [['姓名', '主要信息', '', '', '', '', '部门']]
  • 如果,我们要实现其合并的效果, 需要设定merges选项

  •  const merges = ['A1:A2', 'B1:F1', 'G1:G2']

总结

本篇文章封装了一个组件,方便以后使用,第一次做文章感觉不是很满意,时间有限日后会继续更新的,有什么问题欢迎讨论

如何封装一个导入导出excel的组件相关推荐

  1. 【async-excel】一款异步导入导出excel的组件

    async-excel github地址:https://github.com/2229499815/async-excel 项目介绍 一个基于easyExcel的大数据量数据导入导出异步处理组件.项 ...

  2. java excel data 导入数据_java实现导入导出excel数据

    项目需要,要实现一个导入导出excel的功能,于是,任务驱动着我学习到了POI和JXL这2个java操作Excel的插件. 一.POI和JXL介绍 1.POI:是对所有office资源进行读写的一套工 ...

  3. java 动态导入excel_java实现导入导出excel数据

    项目需要,要实现一个导入导出excel的功能,于是,任务驱动着我学习到了POI和JXL这2个java操作Excel的插件. 一.POI和JXL介绍 1.POI:是对所有office资源进行读写的一套工 ...

  4. vue导入导出excel组件封装

    vue导入导出excel组件 可直接使用 参考以下博客,侵删 参考的博客 ##一: 项目安装依赖 npm install --save xlsx 在项目中创建文件夹及文件如下图: excel-impo ...

  5. 【转】 (C#)利用Aspose.Cells组件导入导出excel文件

    Aspose.Cells组件可以不依赖excel来导入导出excel文件: 导入: public static System.Data.DataTable ReadExcel(String strFi ...

  6. .NET Core 中导入导出Excel

    操作Excel是一个比较常见的业务场景,本篇将使用EPPlus简单演示一个导入导出的示例. EPPlus开源地址:https://github.com/EPPlusSoftware/EPPlus 在项 ...

  7. ASP.NET Core 导入导出Excel xlsx 文件

    ASP.NET Core 使用EPPlus.Core导入导出Excel xlsx 文件,EPPlus.Core支持Excel 2007/2010 xlsx文件导入导出,可以运行在Windows, Li ...

  8. Java导入导出Excel工具类ExcelUtil

    前段时间做的分布式集成平台项目中,许多模块都用到了导入导出Excel的功能,于是决定封装一个ExcelUtil类,专门用来处理Excel的导入和导出 本项目的持久化层用的是JPA(底层用hiberna ...

  9. vue 导入excel插件_Vue框架下实现导入导出Excel、导出PDF

    项目需求:开发一套基于Vue框架的工程档案管理系统,用于工程项目资料的填写.编辑和归档,经调研需支持如下功能: Excel报表的导入.导出 PDF文件的导出 打印表格 经过技术选型,项目组一致决定通过 ...

最新文章

  1. 计算机视觉一些项目实战技术
  2. 《人人都能看懂经济学》读书笔记
  3. Multiple markers at this line @Override的解决方法
  4. Interview:算法岗位面试—上海某公司算法岗位(偏数据分析,互联网行业)技术面试考点之特征工程考察点
  5. mysql特殊编码_Mysql 字符编码
  6. 安装sql server 2000时,提示:以前的某个程序安装已在安装计算机上创建挂起的文件操作,需重起...
  7. 将z-blog改成英文blog所遇到的问题
  8. 为什么说python是计算机语言的未来_Python这么火,为什么说它不是未来的编程语言?...
  9. JAVA输出两个顺序链表的并集_(顺序表)两个集合求并集-洋葱先生-杨少通
  10. 【操作系统】-- 时间片轮转调度算法、优先级调度算法、多级反馈队列调度算法
  11. 反向代理为何叫反向代理?(含案例)
  12. iOS-App Logo和闪屏图尺寸
  13. 开发后台界面用 div好,还是frame 框架 好?
  14. linux鼠标箭头消失了,Ubuntu 16.04 鼠标光标消失的解决方法(右键可弹窗,可以点击)...
  15. 服务器上传excel文件并读取数据,asp.net上传Excel文件并读取数据的实现方法
  16. python如何查询数据库_通过Python查询数据库信息
  17. 关于双目立体视觉的一些总结(一)
  18. 将图片转换成svg文件,自定义icon小图标,svg速成
  19. 2019年互联网行业进入寒冬?Java程序猿该怎么样适应?
  20. HP-UX 11.31 安装RAC 添加共享磁盘的问题(两种办法)

热门文章

  1. cesium中添加建筑白模
  2. 利用计算机专业知识优化办案系统,利用计算机实现异地侦诉指挥——谈网络视频会议系统在办案中的运用...
  3. coap python3,尝试用python库连接coap资源
  4. 腾讯云Centos系统下中文显示乱码解决
  5. 【UE 从零开始制作坦克】12-制作全自动机枪炮塔
  6. HTML的简单介绍(74)
  7. 脑洞 | 横扫围棋界的AlphaGo竟然出纪录片了!介意剧透者慎点……
  8. 学生学完python靠几个接单网站兼职,实现经济独立
  9. java生成docx_java利用Freemarker模板生成docx格式的word文档
  10. 知识点滴 - 商业付费模式: Flat Rate 固定费率