使用EasyExcel读取excel文件案例
生活随笔
收集整理的這篇文章主要介紹了
使用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文件案例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 硬件:台式机老式键盘知识科普
- 下一篇: 上海电信光猫设置虚拟服务器,你们想要的上