Java簡單使用EasyExcel操作讀寫excel的步驟與要點(diǎn)
前言
EasyExcel是一個(gè)基于Java的、快速、簡潔、解決大文件內(nèi)存溢出的Excel處理工具。
他能讓你在不用考慮性能、內(nèi)存的等因素的情況下,快速完成Excel的讀、寫等功能。
EasyExcel基于POI進(jìn)行封裝優(yōu)化,降低內(nèi)存使用,再大的excel也不會(huì)出現(xiàn)內(nèi)存溢出,讓使用更加簡單方便。
官網(wǎng): https://easyexcel.opensource.alibaba.com/
github: https://github.com/alibaba/easyexcel
特點(diǎn):阿里巴巴開源的工具,代碼簡化,占用內(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寫
準(zhǔn)備一個(gè)實(shí)體類 因?yàn)閑asyexcel根據(jù)實(shí)體類自動(dòng)生成的表 效率非常的高
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實(shí)體類 可以用它生成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; /** * 忽略這個(gè)字段 */ @ExcelIgnore private String ignore; }
它對(duì)應(yīng)生成的就是這樣
寫一個(gè)基本的寫入操作
//根據(jù)list寫入excel @Test public void simpleWrite() { // 寫法1 JDK8+ // since: 3.0.0-beta1 //生成的文件名和文件所在位置 String fileName =path+"easyExcel.xlsx"; //開始寫入 這里說下幾個(gè)參數(shù) //1 fileName 是一個(gè)io流 自動(dòng)生成excel //2 DemoData.class根據(jù)哪個(gè)類的規(guī)則去生成excel //3 sheetName 生成的表的名字 //4 進(jìn)行寫出,寫入到規(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"; //開始寫入 這里說下幾個(gè)參數(shù) //1 fileName 是一個(gè)io流 自動(dòng)生成excel //2 DemoData.class根據(jù)哪個(gè)類的規(guī)則去生成excel //3 sheetName 生成的表的名字 //4 進(jìn)行寫出,寫入到規(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"; //開始寫入 這里說下幾個(gè)參數(shù) //1 fileName 是一個(gè)io流 自動(dòng)生成excel //2 DemoData.class根據(jù)哪個(gè)類的規(guī)則去生成excel //3 sheetName 生成的表的名字 //4 進(jìn)行寫出,寫入到規(guī)則就是我們上面定義的方法循環(huán) EasyExcel.write(fileName,DemoData.class).sheet("模板").doWrite(data()); } }
運(yùn)行完畢之后發(fā)現(xiàn)已經(jīng)生成了,而且和我們想要的數(shù)據(jù)格式是一樣的
easyExcel讀
需要一個(gè)實(shí)體,我們已經(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實(shí)體類 可以用它生成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; /** * 忽略這個(gè)字段 */ @ExcelIgnore private String ignore; }
需要一個(gè)監(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 **/ // 有個(gè)很重要的點(diǎn) DemoDataListener 不能被spring管理,要每次讀取excel都要new,然后里面用到spring可以構(gòu)造方法傳進(jìn)去 public class DemoDataListener extends AnalysisEventListener<DemoData> { private static final Logger LOGGER = LoggerFactory.getLogger(DemoDataListener.class); /** * 每隔5條存儲(chǔ)數(shù)據(jù)庫,實(shí)際使用中可以3000條,然后清理list ,方便內(nèi)存回收 */ private static final int BATCH_COUNT = 5; List<DemoData> list = new ArrayList<DemoData>(); /** * 假設(shè)這個(gè)是一個(gè)DAO,當(dāng)然有業(yè)務(wù)邏輯這個(gè)也可以是一個(gè)service。當(dāng)然如果不用存儲(chǔ)這個(gè)對(duì)象沒用。 */ private DemoDAO demoDAO; public DemoDataListener() { // 這里是demo,所以隨便new一個(gè)。實(shí)際使用如果到了spring,請(qǐng)使用下面的有參構(gòu)造函數(shù) demoDAO = new DemoDAO(); } /** * 如果使用了spring,請(qǐng)使用這個(gè)構(gòu)造方法。每次創(chuàng)建Listener的時(shí)候需要把spring管理的類傳進(jìn)來 * * @param demoDAO */ public DemoDataListener(DemoDAO demoDAO) { this.demoDAO = demoDAO; } /** * 這個(gè)每一條數(shù)據(jù)解析都會(huì)來調(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); // 達(dá)到BATCH_COUNT了,需要去存儲(chǔ)一次數(shù)據(jù)庫,防止數(shù)據(jù)幾萬條數(shù)據(jù)在內(nèi)存,容易OOM if (list.size() >= BATCH_COUNT) { saveData(); // 存儲(chǔ)完成清理 list list.clear(); } } /** * 所有數(shù)據(jù)解析完成了 都會(huì)來調(diào)用 * * @param context */ @Override public void doAfterAllAnalysed(AnalysisContext context) { // 這里也要保存數(shù)據(jù),確保最后遺留的數(shù)據(jù)也存儲(chǔ)到數(shù)據(jù)庫 saveData(); LOGGER.info("所有數(shù)據(jù)解析完成!"); } /** * 加上存儲(chǔ)數(shù)據(jù)庫 */ private void saveData() { demoDAO.save(list); } }
然后寫一個(gè)基本的讀操作
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"; //重點(diǎn)注意監(jiān)聽器讀取的邏輯 //fileName 文件 //DemoData 類規(guī)則 //DemoDataListener 監(jiān)聽器 //sheet().doRead() 表的讀取 EasyExcel.read(fileName,DemoData.class,new DemoDataListener()).sheet().doRead(); } }
啟動(dòng)發(fā)現(xiàn)全部數(shù)據(jù)被正常讀取到
總結(jié)下easyExcel的步驟和要點(diǎn)
1 寫入 根據(jù)固定的類格式進(jìn)行寫入
2 讀取 根據(jù)監(jiān)聽器設(shè)置規(guī)則進(jìn)行讀取
要點(diǎn):盡量提前準(zhǔn)備好模板
結(jié)語
EasyExcel真的比POI要強(qiáng)大太多,先不說防止OOM,就代碼量,前者就已經(jīng)贏太多了
本次只是帶來了Java簡單操作EasyExcel入門案例,也是官方的一個(gè)demo
后續(xù)自己做網(wǎng)站,打算導(dǎo)出導(dǎo)入Excel技術(shù)選型就用它了,后續(xù)更新實(shí)戰(zhàn)代碼
到此這篇關(guān)于Java簡單使用EasyExcel操作讀寫excel的步驟與要點(diǎn)的文章就介紹到這了,更多相關(guān)Java EasyExcel讀寫excel內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java利用easyexcel實(shí)現(xiàn)導(dǎo)入與導(dǎo)出功能
- Java利用EasyExcel讀取寫入Excel詳情
- Java 中EasyExcel的使用方式
- java EasyExcel面向Excel文檔讀寫邏輯示例詳解
- Java利用Easyexcel導(dǎo)出excel表格的示例代碼
- Java?easyExcel的復(fù)雜表頭多級(jí)表頭導(dǎo)入
- Java利用EasyExcel實(shí)現(xiàn)合并單元格
- Java?easyexcel使用教程之導(dǎo)出篇
- Java中Easyexcel?實(shí)現(xiàn)批量插入圖片功能
- Java使用easyExcel實(shí)現(xiàn)導(dǎo)入功能
相關(guān)文章
Springboot項(xiàng)目快速實(shí)現(xiàn)過濾器功能
上篇文章已經(jīng)給大家介紹了Springboot項(xiàng)目如何快速實(shí)現(xiàn)Aop功能,這篇文章給大家介紹Springboot項(xiàng)目如何快速實(shí)現(xiàn)過濾器功能,感興趣的小伙伴可以參考閱讀2023-03-03Mybatis中強(qiáng)大的resultMap功能介紹
這篇文章主要給大家介紹了關(guān)于Mybatis中強(qiáng)大的resultMap功能的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Mybatis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06SpringBoot2整合Redis實(shí)現(xiàn)讀寫操作
Redis,對(duì)于大家來說應(yīng)該不陌生,是經(jīng)常使用的開發(fā)技術(shù)之一。本文將結(jié)合實(shí)例代碼,介紹SpringBoot2整合Redis實(shí)現(xiàn)讀寫操作,感興趣的小伙伴們可以參考一下2021-07-07spring的構(gòu)造函數(shù)注入屬性@ConstructorBinding用法
這篇文章主要介紹了關(guān)于spring的構(gòu)造函數(shù)注入屬性@ConstructorBinding用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12基于SpringBoot和Vue實(shí)現(xiàn)分片上傳系統(tǒng)
最近想做一個(gè)關(guān)于文件上傳的個(gè)人小網(wǎng)盤,一開始嘗試使用了OSS的方案,但是該方案對(duì)于大文件來說并不友好,所以開始嘗試分片上傳方案的探索,接下來小編給大家詳細(xì)的介紹一下如何基于SpringBoot和Vue實(shí)現(xiàn)分片上傳系統(tǒng),需要的朋友可以參考下2023-12-12詳解Maven settings.xml配置(指定本地倉庫、阿里云鏡像設(shè)置)
這篇文章主要介紹了詳解Maven settings.xml配置(指定本地倉庫、阿里云鏡像設(shè)置),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-12-12SpringBoot?pdf打印及預(yù)覽(openhtmltopdf+freemarker)
這篇文章主要介紹了SpringBoot?pdf打印及預(yù)覽(openhtmltopdf+freemarker)2023-05-05