easyExcel-读取Excel

news/2024/10/4 19:46:18/文章来源:https://blog.csdn.net/weixin_46455069/article/details/142030228

1、简单读取,没有合并单元格
2、复杂读取,合并单元格-方法一

1、简单读取,没有合并单元格

1.1、引入pom文件

        <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.3</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version></dependency>

1.2、Excel读取
在这里插入图片描述

1.3、测试代码


import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;@Data
public class userDTo {@ExcelProperty(value = "姓名")private String name;@ExcelProperty(value = "年龄")private String age;/*** 项目名称*/@ExcelProperty(value = "工号")private String workNo;@ExcelProperty(value = "部门")private String dept;}
@Testvoid contextLoads() {File file = new File("D:\\maven_workplace\\BootProject_test\\boot-project-test\\EasyExcel-test\\src\\main\\resources\\测试.xls");Class<userDTo> userDToClass = userDTo.class;EasyExcel.read(file, userDToClass, new AnalysisEventListener<userDTo>() {@Overridepublic void invoke(userDTo userDTo, AnalysisContext analysisContext) {//一条一条数据进解析System.out.println("数据解析---->"+userDTo);}//所有的数据都解析完之后执行@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {}}).sheet().headRowNumber(1).doRead();}// sheet 从0 开始(默认)
//headRowNumber 标题

1.4、结果
在这里插入图片描述

2、复杂读取,合并单元格 -数据嵌套

2.1、读取Excel格式

在这里插入图片描述

2.2、测试代码

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.example.easyexceltest.pojo.userDTo;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import java.io.File;@SpringBootTest
class EasyExcelTestApplicationTests {@Testvoid contextLoads() {File file = new File("D:\\maven_workplace\\BootProject_test\\boot-project-test\\EasyExcel-test\\src\\main\\resources\\测试.xls");Class<userDTo> userDToClass = userDTo.class;EasyExcel.read(file, userDToClass, new AnalysisEventListener<userDTo>() {@Overridepublic void invoke(userDTo userDTo, AnalysisContext analysisContext) {//一条一条数据进解析System.out.println("数据解析---->"+userDTo);}//所有的数据都解析完之后执行@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {System.out.println("数据解析结束");}}).sheet().headRowNumber(1).doRead();}}

2.3、测试结果
在这里插入图片描述
发现使用刚刚的方法已经,合并之后并不能够正常读取数据。只能读合并之后 第一行 数据。

解决办法:

1、实体类:

import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;import java.util.List;
import java.util.Map;@Data
public class userDTo {@ExcelProperty(value = "姓名")private String name;@ExcelProperty(value = "年龄")private String age;/*** 项目名称*/@ExcelProperty(value = "工号")private String workNo;// 把 要从Excel 读取的字段都要写,即使部门要封装到list中@ExcelProperty(value = "部门")private String dept;// 忽略该字段@ExcelIgnoreprivate List<Map<String,String>> deptMap;@ExcelIgnoreprivate List<Dept> deptList;}
@Data
public class Dept {private String dept;
}

2、测试代码:


import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.example.easyexceltest.pojo.Dept;
import com.example.easyexceltest.pojo.userDTo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@SpringBootTest
@Slf4j
class EasyExcelTestApplicationTests {@Testvoid contextLoads() {File file = new File("D:\\maven_workplace\\BootProject_test\\boot-project-test\\EasyExcel-test\\src\\main\\resources\\测试.xls");Class<userDTo> userDToClass = userDTo.class;List<userDTo> deptsInfo = new ArrayList<>();EasyExcel.read(file, userDToClass, new AnalysisEventListener<userDTo>() {@Overridepublic void invoke(userDTo userDTo, AnalysisContext analysisContext) {//一条一条数据进解析System.out.println("数据解析---->"+userDTo);deptsInfo.add(userDTo);}//所有的数据都解析完之后执行@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {System.out.println("数据解析结束");importCustomer(deptsInfo);}}).sheet().headRowNumber(1).doRead();}public void importCustomer(List<userDTo> list) {// 待保存到数据库的数据List<userDTo> data = new ArrayList<>();userDTo customer = new userDTo();List<Map<String, String>> contactsList = new ArrayList<>();for (userDTo obj : list) {// 判断用户名是否为空,if (StringUtils.isNotBlank(obj.getName())) {//信息列表是否有数据,如果有则要把数据保存起来if (contactsList.size() != 0) {customer.setDeptMap(contactsList);data.add(customer);}//重置对象customer = new userDTo();contactsList = new ArrayList<>();customer.setName(obj.getName());customer.setAge(obj.getAge());customer.setWorkNo(obj.getWorkNo());//一个list嵌套写一个map,如果有两个需要写两个mapMap map = new HashMap();map.put("dept", obj.getDept());contactsList.add(map);} else {Map map = new HashMap();map.put("dept", obj.getDept());contactsList.add(map);}}// 保存最后一条数据if (contactsList.size() != 0) {customer.setDeptMap(contactsList);data.add(customer);}System.out.println(data.toString());System.out.println("----------------==");for (userDTo user : data) {List<Map<String, String>> issrInfo = user.getDeptMap();ArrayList<Dept> depts = new ArrayList<>();for (Map<String, String> map : issrInfo) {
//               map 转成 ArrIssExcelDto.class;Dept dept = JSONObject.parseObject(JSON.toJSONString(map), Dept.class);depts.add(dept);}System.out.println(">>>>>>>>>>>>>>>>>>>>将map数据封装到list中");System.out.println(depts);user.setDeptList(depts);System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>");}log.info("---读取data数据为:{}" , JSONObject.toJSONString(data));}}

3、结果:
在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ldbm.cn/p/439888.html

如若内容造成侵权/违法违规/事实不符,请联系编程新知网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

若楠带你初识OpenCV(6) -- 轮廓近似与模板匹配

文章目录 OpenCV轮廓近似1. 读取灰度图2. 二值化阈值处理3. 查找轮廓4. 轮廓近似5. 绘画近似图像 模板匹配1. 读取图片2. 查找与模板图像最匹配的区域3. 找到得分的最大值及其位置4. 绘制匹配区域完整代码 总结 OpenCV OpenCV&#xff08;Open Source Computer Vision Library…

一般位置下的3D齐次旋转矩阵

下面的矩阵虽然复杂&#xff0c;但它的逆矩阵求起来非常简单&#xff0c;只需要在 sin ⁡ θ \sin\theta sinθ 前面加个负号就是原来矩阵的逆矩阵。 如果编程序是可以直接拿来用的&#xff0c;相比其它获取一般旋转轴不经过原点的三维旋转矩阵的途径或算法&#xff0c;应该能…

【H2O2|全栈】关于HTML(6)HTML基础(五 · 完结篇)

HTML基础知识 目录 HTML基础知识 前言 准备工作 标签的具体分类&#xff08;五&#xff09; 本文中的标签在什么位置中使用&#xff1f; 表单&#xff08;二&#xff09; 下拉选择菜单 文本域 案例 拓展标签 iframe框架 案例 预告和回顾 后话 前言 本系列博客介…

建筑二次供水的基本概念

什么是二次供水? 二次供水是城市供水的主要组成部分,是指集中式供水在入户之前经再度储存、加压和消毒后,通过管道输送给用户的供水方式。 为什么要使用二次供水? 由于市政供水的服务水压通常只能达到较低的楼层,而对于超过这个水压高度的建筑物,如高层住宅,就必须通…

小琳AI课堂:深入学习BERT

大家好&#xff0c;这里是小琳AI课堂。今天我们来聊聊BERT&#xff0c;这个在自然语言处理&#xff08;NLP&#xff09;领域掀起革命风潮的模型。 出现背景 在BERT之前&#xff0c;NLP领域主要依赖RNN或CNN模型&#xff0c;这些模型大多只能单向处理文本&#xff0c;从左到右…

python中.之后的圈c、圈v分别代表什么意思?

python中.之后的圈c、圈v分别代表什么意思&#xff1f; Python中&#xff0c;.之后的圈c表示类的实例方法&#xff0c;而圈v表示类的成员变量。 在面向对象编程中&#xff0c;类是一种抽象的数据类型&#xff0c;实例方法是定义在类中的函数&#xff0c;用于操作类的实例变量…

端口安全老化细节

我们都知道port-security aging-time命令用来配置端口安全动态MAC地址的老化时间&#xff0c;但是后面还可以加上类型&#xff1a; [SW1-GigabitEthernet0/0/1]port-security aging-time 5 type absolute Absolute time 绝对老化 inactivity Inactivity time相对老化 …

LC1860C 后来怎么样了

这块芯片前身是大唐旗下联芯的LC1860C&#xff1b;这块传奇芯片在4G时代大放异彩&#xff0c;但是某些原因之后&#xff0c;技术打包转让给三家&#xff0c;分别是&#xff1a;小米&#xff0c;大疆&#xff0c;哲酷&#xff08;VIVO&#xff09;&#xff1b; 1、哲酷 哲酷目…

四.海量数据实时分析-Doris数据导入导出

数据导入 1.概述 Apache Doris 提供多种数据导入方案&#xff0c;可以针对不同的数据源进行选择不同的数据导入方式。 数据源导入方式对象存储&#xff08;s3&#xff09;,HDFS使用 Broker 导入数据本地文件Stream Load, MySQL LoadKafka订阅 Kafka 数据Mysql、PostgreSQL&a…

综合案例-数据可视化-地图

一、pyecharts—地图快速入门 假设我们要将6个地区的某种数量在地图上标注出来&#xff0c;首先导入pyecharts包内地图相关模块&#xff0c;然后准备地图数据&#xff08;数据类型是列表&#xff0c;列表的元素类型为元组&#xff09;&#xff0c;然后把准备好的数据添加进地图…

自动驾驶ADAS算法--使用MATLBA和UE4生成测试视频

原文参考&#xff1a;金书世界 环境搭建参考&#xff1a;用MATLAB2020b和虚拟引擎&#xff08;Unreal Engine&#xff09;联合仿真输出AVM全景测试视频----Matlab环境搭建 matlab参考&#xff1a; https://ww2.mathworks.cn/help/driving/ug/simulate-a-simple-driving-sce…

show命令监控分析mysql实例信息

文章目录 思维导图show 查看数据库实例相关信息SHOW VARIABLES 分析数据库当前变量设置分析连接数据分析线程数分析慢查询变量分析缓存相关分析字符集相关 SHOW STATUS 数据库当前实时状态分析分析连接数据分析线程数分析慢查询分析查询缓存分析排序使用情况分析文件打开数mysq…

uniapp设置微信小程序的交互反馈

链接&#xff1a;uni.showToast(OBJECT) | uni-app官网 (dcloud.net.cn) 设置操作成功的弹窗&#xff1a; title是我们弹窗提示的文字 showToast是我们在加载的时候进入就会弹出的提示。 2.设置失败的提示窗口和标签 icon&#xff1a;error是设置我们失败的logo 设置的文字上…

浏览器插件利器--allWebPluginV2.0.0.20-alpha版发布

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品&#xff0c;致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX控件直接嵌入浏览器&#xff0c;实现插件加载、界面显示、接口调用、事件回调等。支持Chrome、Firefo…

【论文精读】 | 用于时间序列预测的通道对齐坚固的混合Transformer

文章目录 0、摘要1、介绍2、相关工作2.1 用于时间序列预测的Transformers2.2 用于时间序列预测的 RNN、MLP 和 CNN 模型 3、模型结构3.1 令牌化3.2 CARD 注意力胜过token3.3 CARD 注意力胜过渠道3.4 token 混合模块 4、基于信号衰减的损失函数5、实验5.1 长期预测5.2 基于重建的…

一文梳理RAG(检索增强生成)的现状与挑战

一 RAG简介 大模型相较于过去的语言模型具备更加强大的能力&#xff0c;但在实际应用中&#xff0c;例如在准确性、知识更新速度和答案透明度方面&#xff0c;仍存在不少问题&#xff0c;比如典型的幻觉现象。因此&#xff0c;检索增强生成 (Retrieval-Augmented Generation, …

猫眼电影字体破解(图片转码方法)

问题 随便拿一篇电影做样例。我们发现猫眼的页面数据在预览窗口中全是小方框。在当我们拿到源码以后&#xff0c;数据全是加密后的。所以我们需要想办法破解加密&#xff0c;拿到数据。 破解过程 1.源码获取问题与破解 分析 在我们刚刚请求url的时候是可以得到数据的&#xff…

『功能项目』主角身旁召唤/隐藏坐骑【20】

本章项目成果展示 我们打开上一篇19坐骑UI搭建及脚本控制显/隐的项目&#xff0c; 本章要做的事情是在坐骑UI界面点击召唤及隐藏坐骑的功能 首先在外包中拖拽一个坐骑熊的预制体 完全解压缩 重命名为MountBear 在资源文件夹Resources下的/预制体文件夹Prefabs下新建坐骑文件夹…

HUAWEI华为MateBook B5-420 i5 集显(KLCZ-WXX9,KLCZ-WDH9)原装出厂Windows10系统文件下载

适用型号&#xff1a;KLCZ-WXX9、KLCZ-WDH9 链接&#xff1a;https://pan.baidu.com/s/12xnaLtcPjZoyfCcJUHynVQ?pwdelul 提取码&#xff1a;elul 华为原装系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、华为浏览器、Office办公软件、华为…

基于SpringBoot的图书馆座位预约系统+小程序+LW参考示例

系列文章目录 1.基于SSM的洗衣房管理系统原生微信小程序LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统LW参考示例 3.基于SpringBootVue的企业人事管理系统LW参考示例 4.基于SSM的高校实验室管理系统LW参考示例 5.基于SpringBoot的二手数码回收系统原生微信小程序LW参考示…