日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用EasyExcel读取excel文件案例

發布時間:2023/12/10 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用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. 工具類

  • 讀取工具類ReadExcelUtil,為保證工具類的通用性,不使用專屬實體監聽器
  • import com.alibaba.excel.EasyExcel; import com.maple.listener.NoModelListener; import com.maple.listener.ObjectListener;import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;/*** 讀取工具類*/ public class ReadExcelUtil {/*** 返回Map型的實體模型數據* @param fileName 文件名* @param obj 對象反射類 xxx.Class* @param sheetNo sheet編號* @param headNum 表頭行數,1表示1行* @return*/public static Map<String, List<Object>> getMap(String fileName, Class obj, Integer sheetNo, Integer headNum){Map<String, List<Object>> map = new HashMap<>();//new監聽器ObjectListener objectListener = new ObjectListener();//讀取操作EasyExcel.read(fileName, obj, objectListener).sheet(sheetNo).headRowNumber(headNum).doRead();//獲取讀取的數據List<Object> objList = objectListener.getObjectList();//獲取sheet名String objSheetName = objectListener.getSheetName();map.put(objSheetName,objList);return map;}//返回List型的實體模型數據public static List<Object> getList(String fileName,Class obj,Integer sheetNo,Integer headNum){ObjectListener objectListener = new ObjectListener();EasyExcel.read(fileName, obj, objectListener).sheet(sheetNo).headRowNumber(headNum).doRead();List<Object> objList = objectListener.getObjectList();return objList;}//返回有實體模型的表頭public static List<Object> getHeadList(String fileName,Class obj,Integer sheetNo,Integer headNum){ObjectListener objectListener = new ObjectListener();EasyExcel.read(fileName, obj, objectListener).sheet(sheetNo).headRowNumber(headNum).doRead();List<Object> objList = objectListener.getHeadList();return objList;}//返回Map型的沒有實體模型數據public static Map<String,List<Map<Integer, String>>> getMapNoModel(String fileName,Integer sheetNo,Integer headNum){Map<String,List<Map<Integer, String>>> map = new HashMap<>();NoModelListener noModelListener = new NoModelListener();EasyExcel.read(fileName, noModelListener).sheet(sheetNo).headRowNumber(headNum).doRead();List<Map<Integer, String>> lists = noModelListener.getLists();String sheetName = noModelListener.getSheetName();map.put(sheetName,lists);return map;}//返回List型的沒有實體模型數據public static List<Map<Integer, String>> getListNoModel(String fileName,Integer sheetNo,Integer headNum){NoModelListener noModelListener = new NoModelListener();EasyExcel.read(fileName, noModelListener).sheet(sheetNo).headRowNumber(headNum).doRead();List<Map<Integer, String>> lists = noModelListener.getLists();return lists;}//返回List型的沒有實體模型數據(僅有數據)public static List<List<Object>> getOnlyListNoModel(String fileName,Integer sheetNo,Integer headNum){NoModelListener noModelListener = new NoModelListener();EasyExcel.read(fileName, noModelListener).sheet(sheetNo).headRowNumber(headNum).doRead();List<Map<Integer, String>> lists = noModelListener.getLists();List<List<Object>> allData = new ArrayList<>();for (int i = 0; i < lists.size(); i++) {Map<Integer, String> map = lists.get(i);List<Object> rowData = new ArrayList<>();for (Map.Entry<Integer, String> entry : map.entrySet()) {rowData.add(entry.getValue());}allData.add(rowData);}return allData;}//返回沒有實體模型的表頭public static List<Map<Integer,String>> getHeadListNoModel(String fileName,Integer sheetNo,Integer headNum){NoModelListener noModelListener = new NoModelListener();EasyExcel.read(fileName, noModelListener).sheet(sheetNo).headRowNumber(headNum).doRead();List<Map<Integer, String>> lists = noModelListener.getHeadList();return lists;}/*** 返回沒有實體模型的具體行的表頭* @param fileName : 文件名* @param sheetNo : sheet編號* @param headNum : 表頭行數,1表示1行* @param rowNum : 行號,索引從0開始,即0為第一行* @return java.util.List<java.lang.String>* @throws*/public static List<String> getHeadListNoModel(String fileName,Integer sheetNo,Integer headNum,Integer rowNum){NoModelListener noModelListener = new NoModelListener();EasyExcel.read(fileName, noModelListener).sheet(sheetNo).headRowNumber(headNum).doRead();List<Map<Integer, String>> headList = noModelListener.getHeadList();List<String> oneHead = new ArrayList<>();for (int i = 0; i < headList.size(); i++) {if(i==rowNum){Map<Integer, String> map = headList.get(i);for (Map.Entry<Integer, String> entry : map.entrySet()) {oneHead.add(entry.getValue());}}}return oneHead;} }
  • 寫入工具類WriteExcelUtil
  • import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.write.metadata.WriteSheet;import java.util.List;/*** 寫入工具類*/ public class WriteExcelUtil {// 有實體單獨寫一個sheetpublic static void writeSheet(String fileName,List<Object> list,Class obj,Integer sheetNo,String sheetName){ExcelWriter excelWriter = EasyExcel.write(fileName).build();WriteSheet writeSheet = EasyExcel.writerSheet(sheetNo, sheetName).head(obj).build();excelWriter.write(list, writeSheet);//千萬別忘記finish 會幫忙關閉流excelWriter.finish();}//獲取流public static ExcelWriter getExcelWriter(String fileName){ExcelWriter excelWriter = EasyExcel.write(fileName).build();return excelWriter;}//關閉流public static void closeExcelWriter(ExcelWriter excelWriter){//千萬別忘記finish 會幫忙關閉流excelWriter.finish();}/*** 有實體多個sheet一起寫,要使用同一個流* @param excelWriter : 寫入流* @param list : 數據* @param obj : 對應實體類* @param sheetNo : sheet編號,0開始* @param sheetName : sheetName* @return void* @throws*/public static void writeMultipleSheet(ExcelWriter excelWriter,List<Object> list,Class obj,Integer sheetNo,String sheetName){WriteSheet writeSheet = EasyExcel.writerSheet(sheetNo, sheetName).head(obj).build();excelWriter.write(list, writeSheet);}///*** 無實體多個sheet一起寫,要使用同一個流* @param excelWriter : 寫入流* @param list : 數據,List<List<Object>>格式,每一個List<Object>代表一行數據* @param headList : 表頭,List<List<String>,每一個List<String>代表一列的表頭* @param sheetNo : sheet編號* @param sheetName : sheetName* @return void* @throws*/public static void writeMultipleNoModel(ExcelWriter excelWriter,List<List<Object>> list,List<List<String>> headList,Integer sheetNo,String sheetName){WriteSheet writeSheet = EasyExcel.writerSheet(sheetNo, sheetName).head(headList).build();excelWriter.write(list, writeSheet);}}

    執行案例

  • 有實體的多sheet讀取
  • //有實體String fileName = "F:\\testFile\\excel\\stu.xlsx";Map<String, List<Object>> excelMap = new HashMap<String, List<Object>>();//第一張sheet--StudentMap<String, List<Object>> m1 = ReadExcelUtil.getMap(fileName, Student.class, 0, 1);//第二張sheet--CatMap<String, List<Object>> m2 = ReadExcelUtil.getMap(fileName, Cat.class, 1, 1);excelMap.putAll(m1);excelMap.putAll(m2);System.out.println(excelMap);//{Student=[Student(name=AA, age=11), Student(name=BB, age=22), Student(name=AADD, age=33), Student(name=AACC, age=11), Student(name=AAEE, age=5)], Cat=[Cat(name=aa, age=1), Cat(name=bb, age=2), Cat(name=cc, age=3), Cat(name=dd, age=4), Cat(name=ee, age=1)]}
  • 無實體的多sheet讀取
  • String fileName = "F:\\testFile\\excel\\stu.xlsx";Map<String, List<Map<Integer, String>>> excelMap = new HashMap<>();Map<String, List<Map<Integer, String>>> stuMap = ReadExcelUtil.getMapNoModel(fileName, 0, 1);Map<String, List<Map<Integer, String>>> catMap = ReadExcelUtil.getMapNoModel(fileName, 1, 1);excelMap.putAll(stuMap);excelMap.putAll(catMap);System.out.println(excelMap);//{Student=[{0=AA, 1=11}, {0=BB, 1=22}, {0=AADD, 1=33}, {0=AACC, 1=11}, {0=AAEE, 1=5}], Cat=[{0=aa, 1=1}, {0=bb, 1=2}, {0=cc, 1=3}, {0=dd, 1=4}, {0=ee, 1=1}]}
  • 有實體的多sheet寫入
  • List<Object> stuList = new ArrayList<>();Object s1 = new Student("小明",10);Object s2 = new Student("小紅",20);stuList.add(s1);stuList.add(s2);List<Object> catList = new ArrayList<>();Object c1 = new Cat("小明",10);Object c2 = new Cat("小紅",20);catList.add(c1);catList.add(c2);String file = "F:/testFile/excel/writeTest"+System.currentTimeMillis()+".xlsx";ExcelWriter excelWriter = WriteExcelUtil.getExcelWriter(file);WriteExcelUtil.writeMultipleSheet(excelWriter,stuList,Student.class,0,"Student");WriteExcelUtil.writeMultipleSheet(excelWriter,stuList,Cat.class,1,"Cat");WriteExcelUtil.closeExcelWriter(excelWriter);
  • 無實體的單sheet寫入
  • //此處造數據較麻煩,借無實體讀獲取數據再寫入另一個文件//讀取String fileName = "F:\\testFile\\excel\\stu.xlsx";//數據List<List<Object>> stuList = ReadExcelUtil.getOnlyListNoModel(fileName, 0, 1);//表頭List<String> headList = ReadExcelUtil.getHeadListNoModel(fileName, 0, 1,0);List<List<String>> writeHeadList = new ArrayList<>();for (int i = 0; i < headList.size(); i++) {List<String> oneHead = new ArrayList<>();oneHead.add(headList.get(i));writeHeadList.add(oneHead);}//寫入String file = "F:/testFile/excel/writeTest"+System.currentTimeMillis()+".xlsx";ExcelWriter excelWriter = WriteExcelUtil.getExcelWriter(file);WriteExcelUtil.writeMultipleNoModel(excelWriter,stuList,writeHeadList,0,"Student");WriteExcelUtil.closeExcelWriter(excelWriter);

    更多

    • 需上述所有代碼下載:代碼
    • 更多具體情況請參考官方文檔

    總結

    以上是生活随笔為你收集整理的使用EasyExcel读取excel文件案例的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。