本篇文章只记录EasyExcel的读(read)

一、 EasyExcel 是做什么的?

首先看下EasyExcel解释:
EasyExcel是阿里巴巴开源的一个excel处理框架,是一个基于Java的简单、省内存的读写Excel的开源项目。EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。

开源地址:
github地址:https://github.com/alibaba/easyexcel
(光看代码我还是有点懵懵,到小破站搜了相关视频,狂神的一个视频直接解释得一清二楚。几乎直接照着他说的做就好了,当然了要根据自己的实际情况进行适当改动。)

二、项目背景

我做的一个小项目需要把excel表中的数据导入到数据库中,然而有些数据列中还包含了很多数组对象[{…},{…},{…},{…}],而这里面的内容是要当成一个一个字段分别储存到数据库里的,因为人工或者excel都不太现实。所以就去了解了一下这个框架的使用。

excel如下:

注意:excel 不要有任何表头,因为是直接从实体类对应的参数列开始读取

三、具体使用过程

1. pom.xml 配置要加:

      <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version></dependency><!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.75</version></dependency>

2. 代码共有三个步骤:

  1. 创建excel对应的实体对象Dao类;
  2. 写监听器:默认是一行行的读取excel,所以需要创建excel一行一行的回调监听器,监听器主要实现了读取和储存;
  3. 调取监听器:配置好excel的位置,调取监听器读取表,然后存入数据库

步骤一:建立excel对应的实体类

ps: 使用 @ExcelProperty 注解来说明对应的excel列

"电阻测试数据"对应的实体类
(这里需要说明一下,我当时在excel上把这4个参数名全部替换成了对应的英文名)

如果最后要存到数据库里的表结构 和 excel对应的实体类有出入(比如读取到的某个字段是数组对象结构如上图excel中的"电阻测试数据",那么还需要经过处理拆分成多个字段才能分开存入数据库),那就需要额外建立一个与数据库的表对应的类(略),用于接收所有数据并存入数据库中。

数据库创建的表:

步骤二:写监听器

监听器具体实现

/*** Date:2021/10/20* Description: excel一行一行的回调监听器** @author ivyhu*/
@Component
public class DemoDataListener extends AnalysisEventListener<ExcelModel> {@ResourceChargingStationMapper charingStationResistanceReportMapper;@ResourceCharingStationServiceImpl charingStationServiceImpl;private static final Logger LOGGER = LoggerFactory.getLogger(DemoDataListener.class);/*** 有参构造* 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来* @param serviceImpl*/public DemoDataListener(CharingStationServiceImpl serviceImpl) {this.charingStationServiceImpl = serviceImpl;}//无参构造public DemoDataListener() {}/*** 读取数据或执行这个invoke()方法* @param excelModel 类型* @param context    分析器*/@Overridepublic void invoke(ExcelModel excelModel, AnalysisContext context) {LOGGER.info("解析到一条数据:{}", JSON.toJSONString(excelModel));//最终要保存到数据库的数据ChargingStationModel reportModelData = new ChargingStationModel();String productModelNum = "";String itemNo = "";Double groundResistance = 0.0;Double insulationResistance = 0.0;Byte type = 0;Integer singlePilePower = 0;/*** 获取excel表中充电设施产品信息*/String str1 = excelModel.getInfoData();JSONArray array1 = JSON.parseArray(str1);//如果不为空,就解析[{},{},{},{}]类型的数组对象并获取值if (!ObjectUtils.isEmpty(array1)) {for (Object obj : array1) {JSONObject jsonObject = (JSONObject) obj;ChargingStationInfoDataExcelModel infoExcelModel = JSONObject.parseObject(String.valueOf((JSONObject) obj), ChargingStationInfoDataExcelModel.class);type = infoExcelModel.getType();singlePilePower = infoExcelModel.getSinglePilePower();}}/*** 获取excel表中电阻测试数据*/String str = excelModel.getResistanceData();JSONArray array = JSON.parseArray(str);//电阻测试数据不为空,就解析[{},{},{},{}]类型的数组对象并获取值if (!ObjectUtils.isEmpty(array)) {for (Object obj : array) {JSONObject jsonObject = (JSONObject) obj;ChargingStationResistanceDataExcelModel reportModel = JSONObject.parseObject(String.valueOf((JSONObject) obj), ChargingStationResistanceDataExcelModel.class);productModelNum = reportModel.getProductModelNum();itemNo = reportModel.getItemNo();groundResistance = reportModel.getGroundResistance();insulationResistance = reportModel.getInsulationResistance();//插入数据到数据库reportModelData = new ChargingStationModel(excelModel.getReportNo(), excelModel.getModelNum(), productModelNum, itemNo, groundResistance, insulationResistance, type, singlePilePower,excelModel.getOutputVoltageControlErrorOfCharger(), excelModel.getOutputCurrentControlErrorOfCharger(), excelModel.getActiveStopChargeTestOutputCurrentStopRate(), excelModel.getPassiveStopChargeTestOutputCurrentStopRate(),excelModel.getChargerOutputCurrentAdjustmentTimeAbove20A(), excelModel.getChargerOutputCurrentAdjustmentTimeUnder20A(), excelModel.getImpulseCurrent());saveData(reportModelData);}}}/*** 所有数据解析完成了 都会来调用** @param context*/@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// 这里也要保存数据,确保最后遗留的数据也存储到数据库/*saveData();*/LOGGER.info("所有数据解析完成!");}/*** 加上存储数据库*/private void saveData(ChargingStationModel resistanceReportModel) {//调用mapper插入数据库charingStationServiceImpl.save(resistanceReportModel);}}

步骤三:调取监听器读取数据
1. Controller层

@RestController
@Controller
@RequestMapping("/product/charging_station")
public class ChargingStationController {@ResourceCharingStationService charingStationService;/*** 提取excel表格数据的接口*/@PostMapping()public void saveExcel(){charingStationService.saveData();}}

2. Service层

@Service
public class CharingStationServiceImpl implements CharingStationService {@ResourceChargingStationMapper chargingStationMapper;@ResourceExcelUtil excelUtil;@ResourceChargingStationAcceptanceValueMapper chargingStationAcceptanceValueMapper;/*** 调用读取excel数据的方法*/@Overridepublic void saveData() {excelUtil.excelRead();}

3. 监听器入口
设置好文件地址、文件名、excel对应的实体类

@Component
public class ExcelUtil {@Autowiredprivate CharingStationServiceImpl charingStationServiceImpl;/*** 最简单的读* 1. 创建excel对应的实体对象 ExcelModel* 2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,参照{@link DemoDataListener}* 3. 直接读即可*/private static final Logger LOGGER = LoggerFactory.getLogger(ExcelUtil.class);//文件位置String PATH = "D:\\excelTest\\";public void excelRead() {// 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去String fileName = PATH + "充电桩验收测试数据.xlsx";// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭EasyExcel.read(fileName, ExcelModel.class, new DemoDataListener(charingStationServiceImpl)).sheet().doRead();}
}

本文知识点:

  1. 转化Json,解析[{},{},{},{}]类型的数组对象获取里面的单个内容
JSONObject jsonObject = (JSONObject) obj;
ChargingStationResistanceDataExcelModel reportModel = JSONObject.parseObject(String.valueOf((JSONObject) obj);
  1. 使用注解@Component将DemoDataListener和监听器入口交给Spring来管
@Component
public class DemoDataListener extends AnalysisEventListener<ExcelModel> {...
}
  1. 配置好要读取的文件位置
//文件位置String PATH = "D:\\excelTest\\";public void excelRead() {// 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去String fileName = PATH + "充电桩验收测试数据.xlsx";// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭EasyExcel.read(fileName, ExcelModel.class, new DemoDataListener(charingStationServiceImpl)).sheet().doRead();}

ps: 一开始运行的时候报了几个错:

  1. mapper报空指针。两个可能,查了一下发现一是因为没有将DemoDataListener和监听器入口类注入Spring,导致无法找到bean,需要使用@Component。二是没有通过Spring mvc的模型调用, 只是套用了开源框架中的单元测试@Test运行。
  2. 读取文件失败,因为没有把文件头那栏删掉。

此文只是小菜鸡的一点点记录,有错望各位大佬指正!

使用EasyExcel将本地excel数据读取后导入mysql数据库中相关推荐

  1. 关于怎么把Excel表格导入MySQL数据库中

    关于怎么把Excel表格导入MySQL数据库中 第一步:建造Excel表格并且编辑数据. 1.我们要建立一个Excel表格文件 2.编辑我们需要的数据 3.保存到你知道的位置 第二步:在MySQL中建 ...

  2. php把excel导入mysql数据库中_PHP将Excel文件导入到MySQL数据库

    这篇文章主要介绍了PHP上传Excel文件导入数据到MySQL数据库示例,可以将Excel的数据写入到MySQL数据库中,感兴趣的同学可以了解一下. 最近在做Excel文件导入数据到数据库.网站如果想 ...

  3. mysql用代码导入excel文件在哪里_麻烦大侠们、高手们帮我解决excel表导入mysql数据库中,这是我的代码和映射文件,不知道错在哪...

    excel表见图(表名:excel)我的数据库:graduates,数据表:mynews,字段:title,author,acontent新建myBean包新建db.java连接加载数据库packag ...

  4. Excel表格数据导入mysql数据库中

    1.将excel表格中的数据复制到txt文件中 (如果有中文汉字注意:将txt文件更改成utf-8格式) 2.将.txt文件放入D盘 3.创建数据库和表(注意:数据库中的属性一定要和excel表格中的 ...

  5. 用excel 2016连接mysql_excel导入mysql数据库方法(最新,2016年2月19日)

    网上的方法不少,能用的不多,相信以下方法是最靠谱的,值得记录. 一,先进phpmyadmin数据库管理,导出空表,表的格式为csv,然后用记事本打开,注意要统一编码,数据库是utf-8,就把csv转为 ...

  6. 利用Python爬虫网站数据直接导入mysql数据库中

    说明: 可能经常出现要爬取某个网站的数据,这时候需要利用爬虫技术来完成,这块主要使用Python来实现. 如何搭建Python环境我上节文章有详细描述:使用Python3.7实现爬虫技术,获取自己想要 ...

  7. excel文件数据导入mysql数据库中_将excel里面的数据导入mysql数据库中

    展开全部 条件:PC端已经安装Navicat工具,并636f70793231313335323631343130323136353331333363386161且已经成功连接至数据库. 1.点击鼠标右 ...

  8. 通过jsp向mysql批量导入数据_对大数据的批量导入MySQL数据库

    自己的库里有索引在用insert导入数据时会变慢很多 使用事务+批量导入 可以配置使用spring+mybatis整合的方式关闭自动提交事务(地址),选择批量导入每一百条导入使用list存储值传入到m ...

  9. 网页输入数据到mysql_为什么用PHP编写的网页中,输入的数据不能插入到Mysql数据库中?...

    我去,我要是有你这样的学生,撞墙算了,懒的一笔,抽一下动一下,也不知道举一反三,发个提问吧,懒的直接把代码搞个图,人家回答问题还得给你把代码抄一遍,. 方法一: 在第12行前加下面的 date_def ...

最新文章

  1. 利用smarty生成静态页的关键代码
  2. python在线课程-《Python程序设计与应用》在线课程使用说明
  3. 3kyu Path Finder #3: the Alpinist
  4. 分类的评估标准_机器学习:模型评估之评估指标
  5. 读书印记 - 《异类:不一样的成功启示录》
  6. python数据分享人力资源_Python数据分析帮你清晰的了解整理员工们的工作效率和整体满意度...
  7. 并查集路径压缩_并查集(UnionFind)技巧总结
  8. oracle 监听加密 tcps,通过oracle wallet配置listener tcps加密
  9. mysql 主键 最佳实践_Spring Data Jpa + MySQL IDENTITY 主键下批量插入最佳实践
  10. mysql使用技巧_MySQL使用不得不看的几个小技巧
  11. 分治法与递归求科赫曲线
  12. modelsim调用产生随机数及创建虚拟类
  13. 模型ks_风控建模 模型指标篇
  14. python学习手册教程_python学习手册视频教程
  15. 数字信号处理常见知识点汇总
  16. 多空对比:一个实用的短中长期资金观察指标介绍
  17. [书籍阅读] Spring Persistence with Hibernate
  18. Error running : No valid Maven installation found. Either set the
  19. 5990. 找出数组中的所有孤独数字
  20. mysql-8.0.30-winx64

热门文章

  1. html javascript div 加边框,html div 加边框样式
  2. java将中文转为拼音
  3. OpenCV + CPP 系列(卅三)图像特征提取(Harris角点检测、Shi-Tomasi角点检测、自定义角点检测)
  4. 中文图书期刊数据库文献检索
  5. 数字钱包助记词生成公私钥流程分析
  6. asp.net 判断用户是否使用微信浏览器
  7. python第三方包国内镜像网址
  8. 浙江省初级中级工程师职称评审条件
  9. 自学python入门训练营 李笑来_1901090043-自学训练营学习9群-PYTHON入门
  10. 因数分解 EduCoder习题