最近项目中需要用到Excel表格的上传下载功能,于是选择了EasyExcel这款工具,总的来说非常的好用,下面就做一个简单的演示。

官方文档地址

  • EasyExcel · 语雀
  • Alibaba Easy Excel - 简单、省内存的Java解析Excel工具 | 首页

一、依赖

pom.xml 中需要添加的依赖

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.7</version>
</dependency>

二、创建实体类:和模板一致对应

这里用到了 @ExcelProperty 注解,这个注解很重要必要的一个注解,注解中的两个参数value,index分别代表列名,列序号
1.value 通过标题文本对应
2.index 通过文本行号对应

package com.sinosoft.springbootplus.org.param;import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import lombok.Data;import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;/*** <pre>* 监管机构系统-考勤管理 导入* </pre>** @author ljk* @date 2022-05-18*/
@Data
@ContentRowHeight(21)
@HeadRowHeight(30)
@ColumnWidth(25)
public class JgjgPersonAttendanceImport {@ExcelProperty(value = {"地区"},index = 0)private String areaName;@ExcelProperty(value = {"处室"},index = 1)private String officeName;@ExcelProperty(value = {"姓名"},index = 2)private String personName;@ExcelProperty(value = {"请假类型"},index = 3)private String leaveType;@ExcelProperty(value = {"开始时间"},index = 4)private Date startTime;@ExcelProperty(value = {"结束时间"},index = 5)private Date endTime;@ExcelProperty(value = {"时长"},index = 6)private Integer time;@ExcelProperty(value = {"天数"},index = 7)private BigDecimal day;}

三、监听器(easyexcel是在监听器层完成excel数据读取):

由于读取excel需要实现监听器,并且该监听器不能被spring容器管理,所以我们spring的注解不能在里面用,所以我们需要将service层的接口传入该监听器,实现将excel的内容存储至数据库中。

有个很重要的点 监听器不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去

package com.sinosoft.springbootplus.org.domain.entity;import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import com.sinosoft.springbootplus.org.convert.JgjgPersonAttendanceConvert;
import com.sinosoft.springbootplus.org.domain.service.JgjgPersonAttendanceDomain;
import com.sinosoft.springbootplus.org.param.JgjgPersonAttendanceImport;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.util.ArrayList;
import java.util.List;
/*** <pre>* 监管机构系统-考勤管理* </pre>** @author ljk* @since 2022-05-20*/
public class JgjgPersonAttendanceListener  extends AnalysisEventListener<JgjgPersonAttendanceImport> {private static final Logger LOGGER = LoggerFactory.getLogger(JgjgPersonAttendanceListener.class);/*** 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收*/private static final int BATCH_COUNT = 5;List<JgjgPersonAttendanceImport> list = new ArrayList<JgjgPersonAttendanceImport>();private JgjgPersonAttendanceDomain jgjgPersonAttendanceDomain;public JgjgPersonAttendanceListener() {}public JgjgPersonAttendanceListener(JgjgPersonAttendanceDomain jgjgPersonAttendanceDomain) {this.jgjgPersonAttendanceDomain = jgjgPersonAttendanceDomain;}/*** 这个每一条数据解析都会来调用** @param jgjgPersonAttendanceImport*            one row value. Is is same as {@link AnalysisContext#readRowHolder()}* @param context*/@Overridepublic void invoke(JgjgPersonAttendanceImport jgjgPersonAttendanceImport, AnalysisContext context) {LOGGER.info("解析到一条数据:{}", JSON.toJSONString(jgjgPersonAttendanceImport));list.add(jgjgPersonAttendanceImport);// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOMif (list.size() >= BATCH_COUNT) {saveData();// 存储完成清理 listlist.clear();}}/*** 所有数据解析完成了 都会来调用** @param context*/@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// 这里也要保存数据,确保最后遗留的数据也存储到数据库saveData();LOGGER.info("所有数据解析完成!");}/*** 加上存储数据库*/private void saveData() {LOGGER.info("{}条数据,开始存储数据库!", list.size());for (JgjgPersonAttendanceImport jgjgPersonAttendanceImport : list) {/*SimpleDateFormat formatTime = new SimpleDateFormat("yyyy-MM-dd");jgjgPersonAttendanceImport.setStartTime(formatTime.format(jgjgPersonAttendanceImport.getStartTime()));jgjgPersonAttendanceImport.setEndTime(formatTime.format(jgjgPersonAttendanceImport.getEndTime()));*///判断状态重新赋值if (jgjgPersonAttendanceImport.getLeaveType().equals("病假")){jgjgPersonAttendanceImport.setLeaveType("0");}else if (jgjgPersonAttendanceImport.getLeaveType().equals("事假")){jgjgPersonAttendanceImport.setLeaveType("1");}else if (jgjgPersonAttendanceImport.getLeaveType().equals("产假")){jgjgPersonAttendanceImport.setLeaveType("2");}else if (jgjgPersonAttendanceImport.getLeaveType().equals("婚假")){jgjgPersonAttendanceImport.setLeaveType("3");}else if (jgjgPersonAttendanceImport.getLeaveType().equals("丧假")){jgjgPersonAttendanceImport.setLeaveType("4");}else if (jgjgPersonAttendanceImport.getLeaveType().equals("其他")){jgjgPersonAttendanceImport.setLeaveType("5");}JgjgPersonAttendance jgjgPersonAttendance =JgjgPersonAttendanceConvert.INSTANCE.jgjgPersonAttendanceImportToJgjgPersonAttendance(jgjgPersonAttendanceImport);jgjgPersonAttendanceDomain.saveJgjgPersonAttendance(jgjgPersonAttendance);}LOGGER.info("存储数据库成功!");}
}

四、controller层

//导入@PostMapping("/insertList")@ApiOperation(value = "获取JgjgPersonAttendance导入", notes = "监管机构系统-导入")public void insetJgjgPersonAttendanceImport(MultipartFile file){jgjgPersonAttendanceServiceImpl.insetJgjgPersonAttendanceImport(file);}

五、service层

//导入public void insetJgjgPersonAttendanceImport(MultipartFile file){try {InputStream inputStream = file.getInputStream();EasyExcel.read(inputStream, JgjgPersonAttendanceImport.class, new JgjgPersonAttendanceListener(jgjgPersonAttendanceDomain)).sheet().doRead();} catch (IOException e) {e.printStackTrace();}}

easyExcel模板数据导入数据库相关推荐

  1. 将excel中是数据导入数据库

    2019独角兽企业重金招聘Python工程师标准>>> 将excel中是数据导入数据库 1.利用excel生成sql语句: 列如: 1).insert: =CONCATENATE(& ...

  2. eplise怎么连接数据库_基于手机信令的大数据分析教程(一)数据导入数据库

    前言 该套教程以一个初学大数据的菜鸟视角,编写数据分析处理的整套流程.写得较为详(luo)细(suo),希望适用于任何城乡规划大数据的初学者.持续更新中,若有错误,望指正! 1.任务总纲 (1)职住数 ...

  3. python将EXCEL数据导入数据库时日期型数据变成数字并加.0的问题一行代码解决方案方案

    [问题描述]:python将EXCEL数据导入数据库时日期变成文本型数据并显示为数字格式 [解决方案] 数据源: codes: #!/usr/bin/python3 -- coding: utf-8 ...

  4. 转:[Asp.net]常见数据导入Excel,Excel数据导入数据库解决方案,总有一款适合你!...

    引言 项目中常用到将数据导入Excel,将Excel中的数据导入数据库的功能,曾经也查找过相关的内容,将曾经用过的方案总结一下. 方案一 NPOI NPOI 是 POI 项目的 .NET 版本.POI ...

  5. python接入excel_使用python将excel数据导入数据库过程详解

    因为需要对数据处理,将excel数据导入到数据库,记录一下过程. 使用到的库:xlrd 和 pymysql (如果需要写到excel可以使用xlwt) 直接丢代码,使用python3,注释比较清楚. ...

  6. 从EXCEL文件将数据导入数据库的向导程序设计!

    原创文章,转载请注明出处! 最近在做一个向导程序,希望把EXCEL表中数据导入数据库,首先是选择数据源.字段匹配最后进行数据检验和错误设置!类的关系比较复杂,希望理清类与类之间的关系.程序的架构有些像 ...

  7. Excel数据导入数据库(Java)

    Excel 文件数据导入数据库 首先说明下读写Excel三种常用的技术: POI : 效率高,操作相对JXL复杂,支持公式,宏,图像图表,一些企业应用上会比较实用.能够修饰单元格属性.字体 数字 日期 ...

  8. ssis 导入excel_使用SSIS包将MS Excel数据导入数据库

    ssis 导入excel The easiest way to import the data into the SQL database is using the Import Data wizar ...

  9. CAD数据导入数据库

    CAD数据导入数据库 1.读取CAD数据 分层读取CAD数据 /// <summary>/// 获取CAD图层(点线面)/// </summary>/// <param ...

最新文章

  1. 关于通过Sequential容器创建LeNet-5
  2. hive数据仓库摘录和总结
  3. c++ vector查找_C++ vector内存分配策略浅析
  4. 【Network Security!】入侵痕迹清除,修改系统日志
  5. Lync Server 2010 语音质量
  6. python zipfile压缩_Python压缩模块zipfile实现原理及用法解析
  7. Python中copy,deepcopy,浅拷贝(“=”)和深拷贝(“copy.deepcopy()”)
  8. 基于JAVA+SpringMVC+Mybatis+MYSQL的奖学金评定管理系统
  9. 大家有用 hackerrank 刷过题吗,这家公司出了一个题来让大家测测自己有多牛
  10. 回溯法 —— 求解子集和问题
  11. 模块和包——Python
  12. Python单元测试框架之pytest 1 ---如何执行测试用例
  13. thinkphp 语言包丢失
  14. [图形学]拉普拉斯网格变形(Laplace Deformation)原理及复现
  15. PCB设计的工艺流程
  16. bat文件建文件夹时乱码及失败问题
  17. 获取上一个自然周的、上一个自然月的起始时间范围
  18. linux里面查找替换命令,Linux常用命令(一)————查找和替换
  19. html 网页地图集制作ECHARTS,在页面使用echarts的地图(解决地图不完整)
  20. opencv 识别黄色物体的程序代码

热门文章

  1. 项目展示: 道路车辆状态的识别
  2. 【Hotspot】 执行字节码指令流程(1):堆栈的创建以及Java函数调用
  3. 丙烯酸涂料的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  4. pythonweb视频播放器_GitHub - python-web/Youku-HTML5-Player: 告别flash和广告
  5. 使用mybatis搭建的Web项目访问网页时有时出现加载很慢的情况
  6. 卡夫曼自适应移动均线交易系统
  7. Tinder养号防封攻略来了:最新Tinder养号流程和运营攻略
  8. UE4学习案例——多人网络中同步信息的方法
  9. 机器阅读理解MRC论文整理
  10. SpringMVC学习之三层架构