使用EasyExcel读取excel文件案例
生活随笔
收集整理的這篇文章主要介紹了
使用EasyExcel读取excel文件案例
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
需求:
需要一個(gè)讀excel文件中多sheet的工具類,返回List/Map型的數(shù)據(jù);同時(shí)也可以進(jìn)行反向?qū)懖僮?/p>
具體步驟
1. 引入maven依賴
<!--excel插件--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.6</version></dependency><!--簡(jiǎn)化實(shí)體插件--><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 有實(shí)體類型
建立實(shí)體類,建立監(jiān)聽器類(通用型/實(shí)體類型)
import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data;/*** @author :maple* @description:學(xué)生類* @date :Created in 2020/11/17 16:41*/ @Data public class Student {//這個(gè)注解用于對(duì)應(yīng)表頭,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)監(jiān)聽器:
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;/*** 通用監(jiān)聽器*/ public class ObjectListener extends AnalysisEventListener<Object> {private final static Logger LOGGER = LoggerFactory.getLogger(ObjectListener.class);private static final int BATCH_COUNT = 5;//存儲(chǔ)最終數(shù)據(jù)List<Object> objectList = new ArrayList<>();//存儲(chǔ)表頭數(shù)據(jù)List<Object> headList = new ArrayList<>();//存儲(chǔ)sheet名private String sheetName;//暫時(shí)存儲(chǔ)數(shù)據(jù)List<Object> datas = new ArrayList<Object>();@Overridepublic void invoke(Object o, AnalysisContext analysisContext) {LOGGER.info("解析到一條數(shù)據(jù):{}", JSON.toJSONString(o));//一條數(shù)據(jù)添加到暫時(shí)存儲(chǔ)的存儲(chǔ)結(jié)構(gòu)中datas.add(o);// 達(dá)到BATCH_COUNT了,需要去存儲(chǔ)一次數(shù)據(jù)庫(kù),防止數(shù)據(jù)幾萬(wàn)條數(shù)據(jù)在內(nèi)存,容易OOMif (datas.size() >= BATCH_COUNT) {saveData();// 存儲(chǔ)完成清理 listdatas.clear();}}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {//獲取sheetNamesheetName = context.readSheetHolder().getSheetName(); // LOGGER.info("所有數(shù)據(jù)解析完成!");}//獲取表頭@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {//把表頭數(shù)據(jù)加入到存儲(chǔ)結(jié)構(gòu)中headList.add(headMap);}/*** 入庫(kù)*/private void saveData() {LOGGER.info("{}條數(shù)據(jù),開始存儲(chǔ)數(shù)據(jù)庫(kù)!", datas.size());//添加到返回的存儲(chǔ)結(jié)構(gòu)中,也可直接存儲(chǔ)到數(shù)據(jù)庫(kù)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;} }實(shí)體類型監(jiān)聽器
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;/*** 學(xué)生類專屬監(jiān)聽器*/ 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) {//每解析一行數(shù)據(jù),就會(huì)調(diào)用該方法一次LOGGER.info("解析到一條數(shù)據(jù):{}", JSON.toJSONString(student));//一條數(shù)據(jù)添加到暫時(shí)存儲(chǔ)的存儲(chǔ)結(jié)構(gòu)中datas.add(student);// 達(dá)到BATCH_COUNT了,需要去存儲(chǔ)一次數(shù)據(jù)庫(kù),防止數(shù)據(jù)幾萬(wàn)條數(shù)據(jù)在內(nèi)存,容易OOMif (datas.size() >= BATCH_COUNT) {saveData();// 存儲(chǔ)完成清理 listdatas.clear();}}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {//獲取sheetNamesheetName = context.readSheetHolder().getSheetName(); // LOGGER.info("所有數(shù)據(jù)解析完成!");}//獲取表頭@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {//把表頭數(shù)據(jù)加入到存儲(chǔ)結(jié)構(gòu)中headList.add(headMap);}/*** 入庫(kù)*/private void saveData() {LOGGER.info("{}條數(shù)據(jù),開始存儲(chǔ)數(shù)據(jù)庫(kù)!", datas.size());//添加到返回的存儲(chǔ)結(jié)構(gòu)中,也可直接存儲(chǔ)到數(shù)據(jù)庫(kù)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 無實(shí)體型
只需要一個(gè)監(jiān)聽器
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:無實(shí)體模型的監(jiān)聽器*/ public class NoModelListener extends AnalysisEventListener<Map<Integer,String>> {private final static Logger LOGGER = LoggerFactory.getLogger(ExcelListener.class);private static final int BATCH_COUNT = 5;//數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)private List<Map<Integer,String>> lists = new ArrayList<>();//表頭存儲(chǔ)結(jié)構(gòu)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) {//每解析一行數(shù)據(jù),就會(huì)調(diào)用該方法一次LOGGER.info("解析到一條數(shù)據(jù):{}", JSON.toJSONString(o));datas.add(o);// 達(dá)到BATCH_COUNT了,需要去存儲(chǔ)一次數(shù)據(jù)庫(kù),防止數(shù)據(jù)幾萬(wàn)條數(shù)據(jù)在內(nèi)存,容易OOMif (datas.size() >= BATCH_COUNT) {saveData();// 存儲(chǔ)完成清理 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("所有數(shù)據(jù)解析完成!");}/*** 入庫(kù)*/private void saveData() { // LOGGER.info("{}條數(shù)據(jù),開始存儲(chǔ)數(shù)據(jù)庫(kù)!", 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. 工具類
執(zhí)行案例
更多
- 需上述所有代碼下載:代碼
- 更多具體情況請(qǐng)參考官方文檔
總結(jié)
以上是生活随笔為你收集整理的使用EasyExcel读取excel文件案例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 硬件:台式机老式键盘知识科普
- 下一篇: 上海电信光猫设置虚拟服务器,你们想要的上