当前位置:
首页 >
使用EasyExcel读取excel文件案例
发布时间:2023/12/10
49
豆豆
生活随笔
收集整理的这篇文章主要介绍了
使用EasyExcel读取excel文件案例
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
需求:
需要一个读excel文件中多sheet的工具类,返回List/Map型的数据;同时也可以进行反向写操作
具体步骤
1. 引入maven依赖
<!--excel插件--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.6</version></dependency><!--简化实体插件--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.20</version></dependency><!--日志--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.22</version></dependency><!--json--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.58</version></dependency>2.1 有实体类型
建立实体类,建立监听器类(通用型/实体类型)
import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data;/*** @author :maple* @description:学生类* @date :Created in 2020/11/17 16:41*/ @Data public class Student {//这个注解用于对应表头,value为表头值,index为列值@ExcelProperty(value = "姓名",index = 0)private String name;@ExcelProperty(value = "年龄",index = 1)private int age;public Student(String name, int age) {this.name = name;this.age = age;} } import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data;/*** @author :maple* @description:* @date :Created in 2020/11/17 16:45*/ @Data public class Cat {@ExcelProperty(value = "昵称",index = 0)private String name;@ExcelProperty(value = "年龄",index = 1)private int age;public Cat(String name, int age) {this.name = name;this.age = age;} }通用型(Object)监听器:
import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.fastjson.JSON; import org.slf4j.Logger; import org.slf4j.LoggerFactory;import java.util.ArrayList; import java.util.List; import java.util.Map;/*** 通用监听器*/ public class ObjectListener extends AnalysisEventListener<Object> {private final static Logger LOGGER = LoggerFactory.getLogger(ObjectListener.class);private static final int BATCH_COUNT = 5;//存储最终数据List<Object> objectList = new ArrayList<>();//存储表头数据List<Object> headList = new ArrayList<>();//存储sheet名private String sheetName;//暂时存储数据List<Object> datas = new ArrayList<Object>();@Overridepublic void invoke(Object o, AnalysisContext analysisContext) {LOGGER.info("解析到一条数据:{}", JSON.toJSONString(o));//一条数据添加到暂时存储的存储结构中datas.add(o);// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOMif (datas.size() >= BATCH_COUNT) {saveData();// 存储完成清理 listdatas.clear();}}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {//获取sheetNamesheetName = context.readSheetHolder().getSheetName(); // LOGGER.info("所有数据解析完成!");}//获取表头@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {//把表头数据加入到存储结构中headList.add(headMap);}/*** 入库*/private void saveData() {LOGGER.info("{}条数据,开始存储数据库!", datas.size());//添加到返回的存储结构中,也可直接存储到数据库objectList.addAll(datas);}public List<Object> getDatas() {return datas;}public void setDatas(List<Object> datas) {this.datas = datas;}public List<Object> getObjectList() {return objectList;}public void setObjectList(List<Object> objectList) {this.objectList = objectList;}public String getSheetName() {return sheetName;}public void setSheetName(String sheetName) {this.sheetName = sheetName;}public List<Object> getHeadList() {return headList;}public void setHeadList(List<Object> headList) {this.headList = headList;} }实体类型监听器
import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.fastjson.JSON; import com.maple.entity.Student; import org.slf4j.Logger; import org.slf4j.LoggerFactory;import java.util.ArrayList; import java.util.List; import java.util.Map;/*** 学生类专属监听器*/ public class StudentListener extends AnalysisEventListener<Student> {private final static Logger LOGGER = LoggerFactory.getLogger(StudentListener.class);private static final int BATCH_COUNT = 5;List<Object> objectList = new ArrayList<>();List<Object> headList = new ArrayList<>();private String sheetName;List<Object> datas = new ArrayList<Object>();@Overridepublic void invoke(Student student, AnalysisContext analysisContext) {//每解析一行数据,就会调用该方法一次LOGGER.info("解析到一条数据:{}", JSON.toJSONString(student));//一条数据添加到暂时存储的存储结构中datas.add(student);// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOMif (datas.size() >= BATCH_COUNT) {saveData();// 存储完成清理 listdatas.clear();}}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {//获取sheetNamesheetName = context.readSheetHolder().getSheetName(); // LOGGER.info("所有数据解析完成!");}//获取表头@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {//把表头数据加入到存储结构中headList.add(headMap);}/*** 入库*/private void saveData() {LOGGER.info("{}条数据,开始存储数据库!", datas.size());//添加到返回的存储结构中,也可直接存储到数据库objectList.addAll(datas);}public List<Object> getDatas() {return datas;}public void setDatas(List<Object> datas) {this.datas = datas;}public List<Object> getObjectList() {return objectList;}public void setObjectList(List<Object> objectList) {this.objectList = objectList;}public String getSheetName() {return sheetName;}public void setSheetName(String sheetName) {this.sheetName = sheetName;}public List<Object> getHeadList() {return headList;}public void setHeadList(List<Object> headList) {this.headList = headList;} }2.2 无实体型
只需要一个监听器
import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.fastjson.JSON; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.sunyard.util.file.excel.ExcelListener;import java.util.ArrayList; import java.util.List; import java.util.Map;/*** @author :maple* @description:无实体模型的监听器*/ public class NoModelListener extends AnalysisEventListener<Map<Integer,String>> {private final static Logger LOGGER = LoggerFactory.getLogger(ExcelListener.class);private static final int BATCH_COUNT = 5;//数据存储结构private List<Map<Integer,String>> lists = new ArrayList<>();//表头存储结构List<Map<Integer,String>> headList = new ArrayList<>();//sheet名private String sheetName;List<Map<Integer,String>> datas = new ArrayList<Map<Integer,String>>();@Overridepublic void invoke(Map<Integer,String> o, AnalysisContext analysisContext) {//每解析一行数据,就会调用该方法一次LOGGER.info("解析到一条数据:{}", JSON.toJSONString(o));datas.add(o);// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOMif (datas.size() >= BATCH_COUNT) {saveData();// 存储完成清理 listdatas.clear();}}//获取表头@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {headList.add(headMap);}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {//获取sheetNamesheetName = context.readSheetHolder().getSheetName();saveData(); // LOGGER.info("所有数据解析完成!");}/*** 入库*/private void saveData() { // LOGGER.info("{}条数据,开始存储数据库!", datas.size());lists.addAll(datas);}public List<Map<Integer,String>> getDatas() {return datas;}public void setDatas(List<Map<Integer,String>> datas) {this.datas = datas;}public List<Map<Integer, String>> getLists() {return lists;}public void setLists(List<Map<Integer, String>> lists) {this.lists = lists;}public String getSheetName() {return sheetName;}public void setSheetName(String sheetName) {this.sheetName = sheetName;}public List<Map<Integer,String>> getHeadList() {return headList;}public void setHeadList(List<Map<Integer,String>> headList) {this.headList = headList;} }3. 工具类
执行案例
更多
- 需上述所有代码下载:代码
- 更多具体情况请参考官方文档
总结
以上是生活随笔为你收集整理的使用EasyExcel读取excel文件案例的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 硬件:台式机老式键盘知识科普
- 下一篇: 上海电信光猫设置虚拟服务器,你们想要的上