Java簡單使用EasyExcel操作讀寫excel的步驟與要點
前言
EasyExcel是一個基于Java的、快速、簡潔、解決大文件內(nèi)存溢出的Excel處理工具。
他能讓你在不用考慮性能、內(nèi)存的等因素的情況下,快速完成Excel的讀、寫等功能。
EasyExcel基于POI進行封裝優(yōu)化,降低內(nèi)存使用,再大的excel也不會出現(xiàn)內(nèi)存溢出,讓使用更加簡單方便。
官網(wǎng): https://easyexcel.opensource.alibaba.com/
github: https://github.com/alibaba/easyexcel
特點:阿里巴巴開源的工具,代碼簡化,占用內(nèi)存少,優(yōu)化OOM(內(nèi)存溢出異常)
引入EasyExcel依賴
<!--easyExcel依賴--> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.0-beta2</version> </dependency>
easyExcel寫
準備一個實體類 因為easyexcel根據(jù)實體類自動生成的表 效率非常的高
package com.wyh.entity; import com.alibaba.excel.annotation.ExcelIgnore; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; import java.util.Date; /** * @program: JavaExecl * @description: easyExcel實體類 可以用它生成excel * @author: 魏一鶴 * @createDate: 2021-12-18 23:03 **/ @Data public class DemoData { @ExcelProperty("字符串標(biāo)題") private String string; @ExcelProperty("日期標(biāo)題") private Date date; @ExcelProperty("數(shù)字標(biāo)題") private Double doubleData; /** * 忽略這個字段 */ @ExcelIgnore private String ignore; }
它對應(yīng)生成的就是這樣
寫一個基本的寫入操作
//根據(jù)list寫入excel @Test public void simpleWrite() { // 寫法1 JDK8+ // since: 3.0.0-beta1 //生成的文件名和文件所在位置 String fileName =path+"easyExcel.xlsx"; //開始寫入 這里說下幾個參數(shù) //1 fileName 是一個io流 自動生成excel //2 DemoData.class根據(jù)哪個類的規(guī)則去生成excel //3 sheetName 生成的表的名字 //4 進行寫出,寫入到規(guī)則就是我們上面定義的方法循環(huán) EasyExcel.write(fileName,DemoData.class).sheet("模板").doWrite(data()); }
完整的代碼
package com.wyh.Test; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.write.metadata.WriteSheet; import com.wyh.entity.DemoData; import org.apache.commons.collections4.ListUtils; import org.junit.Test; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * @program: JavaExecl * @description: easyExcel寫操作 * @author: 魏一鶴 * @createDate: 2021-12-18 23:08 **/ public class EasyExcelWrite { //全局路徑,供我們操作使用方便 static String path="D:\\Tools\\JavaWorkSpace\\JavaExecl\\"; private List<DemoData> data() { List<DemoData> list = new ArrayList<DemoData>(); for (int i = 0; i < 10; i++) { DemoData data = new DemoData(); data.setString("字符串" + i); data.setDate(new Date()); data.setDoubleData(0.56); list.add(data); } return list; } //根據(jù)list寫入excel @Test public void simpleWrite() { // 寫法1 JDK8+ // since: 3.0.0-beta1 //生成的文件名和文件所在位置 String fileName =path+"easyExcel.xlsx"; //開始寫入 這里說下幾個參數(shù) //1 fileName 是一個io流 自動生成excel //2 DemoData.class根據(jù)哪個類的規(guī)則去生成excel //3 sheetName 生成的表的名字 //4 進行寫出,寫入到規(guī)則就是我們上面定義的方法循環(huán) EasyExcel.write(fileName,DemoData.class).sheet("模板").doWrite(data()); } } package com.wyh.Test; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.write.metadata.WriteSheet; import com.wyh.entity.DemoData; import org.apache.commons.collections4.ListUtils; import org.junit.Test; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * @program: JavaExecl * @description: easyExcel寫操作 * @author: 魏一鶴 * @createDate: 2021-12-18 23:08 **/ public class EasyExcelWrite { //全局路徑,供我們操作使用方便 static String path="D:\\Tools\\JavaWorkSpace\\JavaExecl\\"; private List<DemoData> data() { List<DemoData> list = new ArrayList<DemoData>(); for (int i = 0; i < 10; i++) { DemoData data = new DemoData(); data.setString("字符串" + i); data.setDate(new Date()); data.setDoubleData(0.56); list.add(data); } return list; } //根據(jù)list寫入excel @Test public void simpleWrite() { // 寫法1 JDK8+ // since: 3.0.0-beta1 //生成的文件名和文件所在位置 String fileName =path+"easyExcel.xlsx"; //開始寫入 這里說下幾個參數(shù) //1 fileName 是一個io流 自動生成excel //2 DemoData.class根據(jù)哪個類的規(guī)則去生成excel //3 sheetName 生成的表的名字 //4 進行寫出,寫入到規(guī)則就是我們上面定義的方法循環(huán) EasyExcel.write(fileName,DemoData.class).sheet("模板").doWrite(data()); } }
運行完畢之后發(fā)現(xiàn)已經(jīng)生成了,而且和我們想要的數(shù)據(jù)格式是一樣的
easyExcel讀
需要一個實體,我們已經(jīng)有了,可以直接用上面的DemoData
package com.wyh.entity; import com.alibaba.excel.annotation.ExcelIgnore; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; import java.util.Date; /** * @program: JavaExecl * @description: easyExcel實體類 可以用它生成excel * @author: 魏一鶴 * @createDate: 2021-12-18 23:03 **/ @Data public class DemoData { @ExcelProperty("字符串標(biāo)題") private String string; @ExcelProperty("日期標(biāo)題") private Date date; @ExcelProperty("數(shù)字標(biāo)題") private Double doubleData; /** * 忽略這個字段 */ @ExcelIgnore private String ignore; }
需要一個監(jiān)聽器
package com.wyh.Test; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.excel.metadata.CellData; import com.alibaba.excel.metadata.CellExtra; import com.alibaba.excel.read.listener.ReadListener; import com.alibaba.fastjson.JSON; import com.wyh.entity.DemoData; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.ListUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * @program: JavaExecl * @description: easyExcel監(jiān)聽器 * @author: 魏一鶴 * @createDate: 2021-12-18 23:30 **/ // 有個很重要的點 DemoDataListener 不能被spring管理,要每次讀取excel都要new,然后里面用到spring可以構(gòu)造方法傳進去 public class DemoDataListener extends AnalysisEventListener<DemoData> { private static final Logger LOGGER = LoggerFactory.getLogger(DemoDataListener.class); /** * 每隔5條存儲數(shù)據(jù)庫,實際使用中可以3000條,然后清理list ,方便內(nèi)存回收 */ private static final int BATCH_COUNT = 5; List<DemoData> list = new ArrayList<DemoData>(); /** * 假設(shè)這個是一個DAO,當(dāng)然有業(yè)務(wù)邏輯這個也可以是一個service。當(dāng)然如果不用存儲這個對象沒用。 */ private DemoDAO demoDAO; public DemoDataListener() { // 這里是demo,所以隨便new一個。實際使用如果到了spring,請使用下面的有參構(gòu)造函數(shù) demoDAO = new DemoDAO(); } /** * 如果使用了spring,請使用這個構(gòu)造方法。每次創(chuàng)建Listener的時候需要把spring管理的類傳進來 * * @param demoDAO */ public DemoDataListener(DemoDAO demoDAO) { this.demoDAO = demoDAO; } /** * 這個每一條數(shù)據(jù)解析都會來調(diào)用 * * @param data * one row value. Is is same as {@link AnalysisContext#readRowHolder()} * @param context */ @Override public void invoke(DemoData data, AnalysisContext context) { System.out.println(JSON.toJSONString(data)); list.add(data); System.out.println(list); // 達到BATCH_COUNT了,需要去存儲一次數(shù)據(jù)庫,防止數(shù)據(jù)幾萬條數(shù)據(jù)在內(nèi)存,容易OOM if (list.size() >= BATCH_COUNT) { saveData(); // 存儲完成清理 list list.clear(); } } /** * 所有數(shù)據(jù)解析完成了 都會來調(diào)用 * * @param context */ @Override public void doAfterAllAnalysed(AnalysisContext context) { // 這里也要保存數(shù)據(jù),確保最后遺留的數(shù)據(jù)也存儲到數(shù)據(jù)庫 saveData(); LOGGER.info("所有數(shù)據(jù)解析完成!"); } /** * 加上存儲數(shù)據(jù)庫 */ private void saveData() { demoDAO.save(list); } }
然后寫一個基本的讀操作
package com.wyh.Test; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelReader; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.read.listener.ReadListener; import com.alibaba.excel.read.metadata.ReadSheet; import com.alibaba.fastjson.JSON; import com.wyh.entity.DemoData; import org.apache.commons.collections4.ListUtils; import org.junit.Test; import java.io.File; import java.util.List; /** * @program: JavaExecl * @description: excel讀數(shù)據(jù) * @author: 魏一鶴 * @createDate: 2021-12-18 23:38 **/ public class EasyExcelRead { //全局路徑,供我們操作使用方便 static String path="D:\\Tools\\JavaWorkSpace\\JavaExecl\\"; @Test public void simpleRead() { //文件路徑 String fileName = path + "easyExcel.xlsx"; //重點注意監(jiān)聽器讀取的邏輯 //fileName 文件 //DemoData 類規(guī)則 //DemoDataListener 監(jiān)聽器 //sheet().doRead() 表的讀取 EasyExcel.read(fileName,DemoData.class,new DemoDataListener()).sheet().doRead(); } }
啟動發(fā)現(xiàn)全部數(shù)據(jù)被正常讀取到
總結(jié)下easyExcel的步驟和要點
1 寫入 根據(jù)固定的類格式進行寫入
2 讀取 根據(jù)監(jiān)聽器設(shè)置規(guī)則進行讀取
要點:盡量提前準備好模板
結(jié)語
EasyExcel真的比POI要強大太多,先不說防止OOM,就代碼量,前者就已經(jīng)贏太多了
本次只是帶來了Java簡單操作EasyExcel入門案例,也是官方的一個demo
后續(xù)自己做網(wǎng)站,打算導(dǎo)出導(dǎo)入Excel技術(shù)選型就用它了,后續(xù)更新實戰(zhàn)代碼
到此這篇關(guān)于Java簡單使用EasyExcel操作讀寫excel的步驟與要點的文章就介紹到這了,更多相關(guān)Java EasyExcel讀寫excel內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java利用easyexcel實現(xiàn)導(dǎo)入與導(dǎo)出功能
- Java利用EasyExcel讀取寫入Excel詳情
- Java 中EasyExcel的使用方式
- java EasyExcel面向Excel文檔讀寫邏輯示例詳解
- Java利用Easyexcel導(dǎo)出excel表格的示例代碼
- Java?easyExcel的復(fù)雜表頭多級表頭導(dǎo)入
- Java利用EasyExcel實現(xiàn)合并單元格
- Java?easyexcel使用教程之導(dǎo)出篇
- Java中Easyexcel?實現(xiàn)批量插入圖片功能
- Java使用easyExcel實現(xiàn)導(dǎo)入功能
相關(guān)文章
SpringBoot2整合Redis實現(xiàn)讀寫操作
Redis,對于大家來說應(yīng)該不陌生,是經(jīng)常使用的開發(fā)技術(shù)之一。本文將結(jié)合實例代碼,介紹SpringBoot2整合Redis實現(xiàn)讀寫操作,感興趣的小伙伴們可以參考一下2021-07-07spring的構(gòu)造函數(shù)注入屬性@ConstructorBinding用法
這篇文章主要介紹了關(guān)于spring的構(gòu)造函數(shù)注入屬性@ConstructorBinding用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12基于SpringBoot和Vue實現(xiàn)分片上傳系統(tǒng)
最近想做一個關(guān)于文件上傳的個人小網(wǎng)盤,一開始嘗試使用了OSS的方案,但是該方案對于大文件來說并不友好,所以開始嘗試分片上傳方案的探索,接下來小編給大家詳細的介紹一下如何基于SpringBoot和Vue實現(xiàn)分片上傳系統(tǒng),需要的朋友可以參考下2023-12-12詳解Maven settings.xml配置(指定本地倉庫、阿里云鏡像設(shè)置)
這篇文章主要介紹了詳解Maven settings.xml配置(指定本地倉庫、阿里云鏡像設(shè)置),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12SpringBoot?pdf打印及預(yù)覽(openhtmltopdf+freemarker)
這篇文章主要介紹了SpringBoot?pdf打印及預(yù)覽(openhtmltopdf+freemarker)2023-05-05