使用EasyExcel将本地excel数据读取后导入mysql数据库中
本篇文章只记录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. 代码共有三个步骤:
- 创建excel对应的实体对象Dao类;
- 写监听器:默认是一行行的读取excel,所以需要创建excel一行一行的回调监听器,监听器主要实现了读取和储存;
- 调取监听器:配置好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();}
}
本文知识点:
- 转化Json,解析[{},{},{},{}]类型的数组对象获取里面的单个内容
JSONObject jsonObject = (JSONObject) obj;
ChargingStationResistanceDataExcelModel reportModel = JSONObject.parseObject(String.valueOf((JSONObject) obj);
- 使用注解@Component将DemoDataListener和监听器入口交给Spring来管
@Component
public class DemoDataListener extends AnalysisEventListener<ExcelModel> {...
}
- 配置好要读取的文件位置
//文件位置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: 一开始运行的时候报了几个错:
- mapper报空指针。两个可能,查了一下发现一是因为没有将DemoDataListener和监听器入口类注入Spring,导致无法找到bean,需要使用@Component。二是没有通过Spring mvc的模型调用, 只是套用了开源框架中的单元测试@Test运行。
- 读取文件失败,因为没有把文件头那栏删掉。
此文只是小菜鸡的一点点记录,有错望各位大佬指正!
使用EasyExcel将本地excel数据读取后导入mysql数据库中相关推荐
- 关于怎么把Excel表格导入MySQL数据库中
关于怎么把Excel表格导入MySQL数据库中 第一步:建造Excel表格并且编辑数据. 1.我们要建立一个Excel表格文件 2.编辑我们需要的数据 3.保存到你知道的位置 第二步:在MySQL中建 ...
- php把excel导入mysql数据库中_PHP将Excel文件导入到MySQL数据库
这篇文章主要介绍了PHP上传Excel文件导入数据到MySQL数据库示例,可以将Excel的数据写入到MySQL数据库中,感兴趣的同学可以了解一下. 最近在做Excel文件导入数据到数据库.网站如果想 ...
- mysql用代码导入excel文件在哪里_麻烦大侠们、高手们帮我解决excel表导入mysql数据库中,这是我的代码和映射文件,不知道错在哪...
excel表见图(表名:excel)我的数据库:graduates,数据表:mynews,字段:title,author,acontent新建myBean包新建db.java连接加载数据库packag ...
- Excel表格数据导入mysql数据库中
1.将excel表格中的数据复制到txt文件中 (如果有中文汉字注意:将txt文件更改成utf-8格式) 2.将.txt文件放入D盘 3.创建数据库和表(注意:数据库中的属性一定要和excel表格中的 ...
- 用excel 2016连接mysql_excel导入mysql数据库方法(最新,2016年2月19日)
网上的方法不少,能用的不多,相信以下方法是最靠谱的,值得记录. 一,先进phpmyadmin数据库管理,导出空表,表的格式为csv,然后用记事本打开,注意要统一编码,数据库是utf-8,就把csv转为 ...
- 利用Python爬虫网站数据直接导入mysql数据库中
说明: 可能经常出现要爬取某个网站的数据,这时候需要利用爬虫技术来完成,这块主要使用Python来实现. 如何搭建Python环境我上节文章有详细描述:使用Python3.7实现爬虫技术,获取自己想要 ...
- excel文件数据导入mysql数据库中_将excel里面的数据导入mysql数据库中
展开全部 条件:PC端已经安装Navicat工具,并636f70793231313335323631343130323136353331333363386161且已经成功连接至数据库. 1.点击鼠标右 ...
- 通过jsp向mysql批量导入数据_对大数据的批量导入MySQL数据库
自己的库里有索引在用insert导入数据时会变慢很多 使用事务+批量导入 可以配置使用spring+mybatis整合的方式关闭自动提交事务(地址),选择批量导入每一百条导入使用list存储值传入到m ...
- 网页输入数据到mysql_为什么用PHP编写的网页中,输入的数据不能插入到Mysql数据库中?...
我去,我要是有你这样的学生,撞墙算了,懒的一笔,抽一下动一下,也不知道举一反三,发个提问吧,懒的直接把代码搞个图,人家回答问题还得给你把代码抄一遍,. 方法一: 在第12行前加下面的 date_def ...
最新文章
- 利用smarty生成静态页的关键代码
- python在线课程-《Python程序设计与应用》在线课程使用说明
- 3kyu Path Finder #3: the Alpinist
- 分类的评估标准_机器学习:模型评估之评估指标
- 读书印记 - 《异类:不一样的成功启示录》
- python数据分享人力资源_Python数据分析帮你清晰的了解整理员工们的工作效率和整体满意度...
- 并查集路径压缩_并查集(UnionFind)技巧总结
- oracle 监听加密 tcps,通过oracle wallet配置listener tcps加密
- mysql 主键 最佳实践_Spring Data Jpa + MySQL IDENTITY 主键下批量插入最佳实践
- mysql使用技巧_MySQL使用不得不看的几个小技巧
- 分治法与递归求科赫曲线
- modelsim调用产生随机数及创建虚拟类
- 模型ks_风控建模 模型指标篇
- python学习手册教程_python学习手册视频教程
- 数字信号处理常见知识点汇总
- 多空对比:一个实用的短中长期资金观察指标介绍
- [书籍阅读] Spring Persistence with Hibernate
- Error running : No valid Maven installation found. Either set the
- 5990. 找出数组中的所有孤独数字
- mysql-8.0.30-winx64