EasyExcel读取第一行数据,读取表头
在EasyExcel中默认是不会去读取表头数据的
我们在编写EasyExcel解析类的时候,继承了AnalysisEventListener类
看一下该类的结构,可以看到它有invokeHeadMap这个方法
直接覆写这个方法,就可以得到表头数据了
public class ExcelService extends AnalysisEventListener<Map<Integer, String>> {private static final Logger LOGGER = LoggerFactory.getLogger(ExcelService.class);List<Map<Integer, String>> list = new ArrayList<Map<Integer, String>>();@Overridepublic void invoke(Map<Integer, String> data, AnalysisContext context) {LOGGER.info("解析到的数据: {}", data);list.add(data);}@Overridepublic void invokeHeadMap(Map headMap, AnalysisContext context) {LOGGER.info("解析到的表头数据: {}", headMap);}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {saveData();}/*** 如果有必要,存储到数据库*/private void saveData() {LOGGER.info("{}条数据,开始存储数据库!", list.size());LOGGER.info("存储数据库成功!");}
}
测试
@Test
void contextLoads() {String fileName = "test1.xlsx";// 这里 只要,然后读取第一个sheet 同步读取会自动finishEasyExcel.read(fileName, new ExcelService()).sheet().doRead();
}
看到好像有挺多人要做这个需求的,然后都说看不懂我上面的案例,这里就再更新一版完整的代码
准备的 Excel 文件数据(第一行是 Header,其他的是数据)
依赖
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.3</version>
</dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency>
定义一个实体类,用于解析 excel 数据
package com.max.excel.model;import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;@Data
public class UserExcel {@ExcelIgnoreprivate Integer id;@ExcelProperty(index = 0, value = "姓名")private String name;@ExcelProperty(index = 1, value = "年龄")private Integer age;
}
定义一个监听器,用来读取 Excel 数据
package com.max.excel.listener;import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.max.excel.model.UserExcel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@Slf4j
@Component
public class UserExcelListener extends AnalysisEventListener<UserExcel> {// 定义一个全局的读取header的map,方便其他地方使用改数据,当然要是你存进数据库那就更方便取了private final Map<Integer, String> userHeaderMap = new HashMap<>();// excel主数据private List<UserExcel> userExcelList = new ArrayList<>();// excel的主数据是在这个生命周期读取的@Overridepublic void invoke(UserExcel userExcel, AnalysisContext analysisContext) {userExcelList.add(userExcel);}// 解析完excel需要干的事情@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {log.info("已解析完所有数据!");}// excel头部数据@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {// 存到全局的map中userHeaderMap.putAll(headMap);}public List<UserExcel> getUserExcelList() {return userExcelList;}public void setUserExcelList(List<UserExcel> userExcelList) {this.userExcelList = userExcelList;}public Map<Integer, String> getUserHeaderMap() {return userHeaderMap;}
}
测试
package com.max.excel;import com.alibaba.excel.EasyExcel;
import com.max.excel.listener.UserExcelListener;
import com.max.excel.model.UserExcel;
import lombok.extern.slf4j.Slf4j;import java.io.File;
import java.util.Collections;
import java.util.Optional;@Slf4j
public class Test {public static void main(String[] args) {String file = "t.xls";String reFile = "t.xls";UserExcelListener listener = new UserExcelListener();// 读取EasyExcel.read(new File(file), UserExcel.class, listener).sheet(0).doRead();// 读取转成的Java对象log.info("===========Excel Header数据===========");Optional.ofNullable(listener.getUserHeaderMap()).orElse(Collections.emptyMap()).forEach((k, v) -> {System.out.println(v);});log.info("===========Excel数据===========");Optional.ofNullable(listener.getUserExcelList()).orElse(Collections.emptyList()).forEach(System.out::println);}
}
最终结果
EasyExcel读取第一行数据,读取表头相关推荐
- easyexcel 读取指定行数据_EasyExcel从指定位置开始读数据
之前小小的接触过easyExcel,代替了传统的poi,上次使用的时候,表头比较传统,也不复杂,但是这次呢表头稍微有点复杂,读取数据要从指定的位置开始,要从指定位置开始读取easyExcel,所以呢在 ...
- java的socket读取一行就结束运行了?使用这种方法可以读取多行数据!
目录 引出问题 第一种(只能读取一行数据) 第二种(可以读取多行数据) 引出问题 写一个socket的公共方法,结果发现socket读取一行数据就结束了,百思不得其解. 在网上也找了一些资料,很多也有 ...
- 字符缓冲输入流,高效读取整行数据
import java.io.BufferedReader; import java.io.FileReader;/* 字符缓冲输入流,高效读取整行数据*/ public class Writer { ...
- 一个将当前目录下HEX文件的第一行数据删除的程序...
为什么要写这样一个函数 在使用SoftConsole开发M3程序时,生成的hex文件,必须要把第一行数据删除,才能在Libero中使用,所以写了这个小工具,这是2.0版本了,第一版是直接删除第一行数据 ...
- JAVA-获取Excel文件的第一行数据
1.pom.xml引入相关依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi ...
- easyexcel 读取指定行数据_Excel怎么设置只提取指定行中的数据?
Excel怎么设置只提取指定行中的数据?有些时候我们需要从一个excel文件中的数据库中提取指定的行或列中的数据.例如如图示,是国内所有上市公司的行业统计.但是现在我们只需要其中部分上市公司的行业统计 ...
- MySql 随机读取多行数据并显示
随机读取20行: SELECT * FROM quiz ORDER BY RAND() LIMIT 20 分别显示这20行数据: $result=mysql_query($query); ...
- 【工程实践】jsonlines 读取多行数据
前言 在进行数据存储时,json文件简洁精炼,成为首选.但是在简洁的同时,也存在弊端,如果要存储的数据量过大,那么读取一个json文件需要一次性读入,这需要占用很大的内存.所以我们可以将文件存储为多个 ...
- 如何:在OpenText Workflow 6.5模型中保存和读取多行数据
在Captaris Workflow 6.0和之前的版本中,保存多行数据似乎没有被提及,因此大部分(包括我的团队)都要自己建立(利用IDE的向导也算)数据库来保存订单项.物品列表.人员列表这样的多行集 ...
最新文章
- Kafka事务特性详解
- 网易试题——关于箭头函数与this和arguments的关系
- abb限位开关已打开drv1_广告雕刻机限位开关触发
- 小蛮机器人如何联网_机器人视界|数字化时代 机器人成为新晋“代言人”
- 搭建Hadoop平台(一)之配置用户名及hosts文件
- I00025 寻找循环数
- 微信对网络影响的技术试验及分析(论文全文)
- Julia:和Julia相关的经济学网站 和初学者网站
- 成人高考计算机专业,成人高考计算机类里的哪个专业好找工作?
- matlab对样本方差区间估计,已知样本均值和样本方差做区间估计
- 19、STM8单片机RS485串口通讯实验
- 前端导出 xlsx文件
- 【图书馆】——中英文对照表
- 什么是构造函数及定义
- jq 下拉列表选中事件_JQuery select各种事件
- Java 某天的开始时间与结束时间
- Word文档怎样修改纸张的方向?分享方法!word文档如何更改纸张的方向?
- 计算机专业近几年的参考文献,近几年计算机专业发参考文献 计算机专业发专著类参考文献哪里找...
- 电商数据分析指标体系实例。
- 《网络攻防》实验三:免杀原理与实践
热门文章
- 风控并行组合模型及其额度定价场景实践
- 清华大学参赛计算机集群,清华学生超算团队再获双料冠军
- 高并发环境下热点数据访问的最佳实践。
- 2022第17届中国重庆橡塑工业展览会|成都橡塑展
- javaweb应用网站实现第三方QQ登入过程
- 全网最全面的西门子1500硬件冗余项目,博图15.1
- Golang-go mod download 出现 dial tcp 34.64.4.17:443: i/o timeout
- 【数据结构】图—迪杰斯特拉(Dijkstra)算法
- 我把全国旅游数据用Python爬下来后发现,这个地方才是真正的旅游胜地
- git中的smart checkout和force checkout