阿里的Easyexcel讀取Excel文件的方法(最新版本)
本篇文章主要介紹一下使用阿里開源的Easyexcel工具處理讀取excel文件,因?yàn)橹白约合朐诰W(wǎng)上找一下這個(gè)簡單的立即上手的博客,發(fā)現(xiàn)很多文章的教程都針對(duì)比較舊的版本的Easyexcel,沒有使用新版本的方法,導(dǎo)致很多方法都標(biāo)志過期了或者運(yùn)行時(shí)報(bào)錯(cuò),所以本篇博客主要是使用最新版的Easyexcel去讀取excel文件,順便說一下目前新版本的特性。
優(yōu)化
- 目前讀取excel文件不再需要指定ExcelTypeEnum,即excel的版本,會(huì)自動(dòng)處理
- 之前創(chuàng)建ExcelReader都是自己new,現(xiàn)在是通過EasyExcelFactory創(chuàng)建,更加簡單和具備通用性。
- 之前每解析一行的回調(diào)的invoke()方法,通用對(duì)象Object是list集合,目前是HashMap集合。

簡單使用讀取Excel,返回List集合
通過maven引入依賴
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.0.5</version>
</dependency>新建通用監(jiān)聽類StringExcelListener
/**
* StringList 解析監(jiān)聽器
*
* @author zhangcanlong
* @since 2019-10-21
*/
private static class StringExcelListener extends AnalysisEventListener {
/**
* 自定義用于暫時(shí)存儲(chǔ)data
* 可以通過實(shí)例獲取該值
*/
private List<List<String>> datas = new ArrayList<>();
/**
* 每解析一行都會(huì)回調(diào)invoke()方法
*
* @param object 讀取后的數(shù)據(jù)對(duì)象
* @param context 內(nèi)容
*/
@Override
public void invoke(Object object, AnalysisContext context) {
@SuppressWarnings("unchecked") Map<String, String> stringMap = (HashMap<String, String>) object;
//數(shù)據(jù)存儲(chǔ)到list,供批量處理,或后續(xù)自己業(yè)務(wù)邏輯處理。
datas.add(new ArrayList<>(stringMap.values()));
//根據(jù)自己業(yè)務(wù)做處理
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
//解析結(jié)束銷毀不用的資源
//注意不要調(diào)用datas.clear(),否則getDatas為null
}
/**
* 返回?cái)?shù)據(jù)
*
* @return 返回讀取的數(shù)據(jù)集合
**/
public List<List<String>> getDatas() {
return datas;
}
/**
* 設(shè)置讀取的數(shù)據(jù)集合
*
* @param datas 設(shè)置讀取的數(shù)據(jù)集合
**/
public void setDatas(List<List<String>> datas) {
this.datas = datas;
}
}
創(chuàng)建ExcelReader讀取,并從監(jiān)聽類中獲取讀取的數(shù)據(jù)
/**
* 根據(jù)excel輸入流,讀取excel文件
*
* @param inputStream exece表格的輸入流
* @return 返回雙重list的集合
**/
public List<List<String>> writeWithoutHead(InputStream inputStream) {
StringExcelListener listener = new StringExcelListener();
ExcelReader excelReader = EasyExcelFactory.read(inputStream, null, listener).headRowNumber(0).build();
excelReader.read();
List<List<String>> datas = listener.getDatas();
excelReader.finish();
return datas;
}完整的Excel簡單讀取類和測試
測試類:
import com.hiido.services.common.ExcelOptionsService;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
/**
* excel操作的測試類
*
* @author zhangcanlong
* @since 2019/10/20 21:12
**/
@RunWith(SpringRunner.class)
@SpringBootTest
public class ExcelOptionsServiceTest {
@Autowired
private ExcelOptionsService excelOptionsService;
/**
* 測試讀取excel
**/
@Test
public void testReadExcel() {
// 這里的excel文件可以 為xls或xlsx結(jié)尾
File file = new File("C:\\Users\\Administrator\\Desktop\\測試.xls");
List<List<String>> result = new ArrayList<>();
try {
result = excelOptionsService.writeWithoutHead(new FileInputStream(file));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Assert.assertNotNull(result);
System.out.println("讀取結(jié)果:" + result);
}
}
讀取類
import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import org.springframework.stereotype.Service;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* excel文件的操作service
*
* @author zhangcanlong
* @since 2019/10/20 21:01
**/
@Service
public class ExcelOptionsService {
/**
* 根據(jù)excel輸入流,讀取excel文件
*
* @param inputStream exece表格的輸入流
* @return 返回雙重list的集合
**/
public List<List<String>> writeWithoutHead(InputStream inputStream) {
StringExcelListener listener = new StringExcelListener();
ExcelReader excelReader = EasyExcelFactory.read(inputStream, null, listener).headRowNumber(0).build();
excelReader.read();
List<List<String>> datas = listener.getDatas();
excelReader.finish();
return datas;
}
/**
* StringList 解析監(jiān)聽器
*
* @author zhangcanlong
* @since 2019-10-21
*/
private static class StringExcelListener extends AnalysisEventListener {
/**
* 自定義用于暫時(shí)存儲(chǔ)data
* 可以通過實(shí)例獲取該值
*/
private List<List<String>> datas = new ArrayList<>();
/**
* 每解析一行都會(huì)回調(diào)invoke()方法
*
* @param object 讀取后的數(shù)據(jù)對(duì)象
* @param context 內(nèi)容
*/
@Override
public void invoke(Object object, AnalysisContext context) {
@SuppressWarnings("unchecked") Map<String, String> stringMap = (HashMap<String, String>) object;
// 這里可以獲取excel的基本信息,包含excel的總行數(shù)
System.out.println("不一定十分準(zhǔn)確的總行數(shù):"+context.getTotalCount());
//數(shù)據(jù)存儲(chǔ)到list,供批量處理,或后續(xù)自己業(yè)務(wù)邏輯處理。
datas.add(new ArrayList<>(stringMap.values()));
//根據(jù)自己業(yè)務(wù)做處理
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
//解析結(jié)束銷毀不用的資源
//注意不要調(diào)用datas.clear(),否則getDatas為null
}
/**
* 返回?cái)?shù)據(jù)
*
* @return 返回讀取的數(shù)據(jù)集合
**/
public List<List<String>> getDatas() {
return datas;
}
/**
* 設(shè)置讀取的數(shù)據(jù)集合
*
* @param datas 設(shè)置讀取的數(shù)據(jù)集合
**/
public void setDatas(List<List<String>> datas) {
this.datas = datas;
}
}
}
注意
如果在正式項(xiàng)目中使用的,要修改一些東西的,我這個(gè)只是demo,我為了方便把StringExcelListener 放到內(nèi)部類了,應(yīng)該把這個(gè)類抽出來作為單獨(dú)一個(gè)service類的
參考資料:
https://blog.csdn.net/alinyua/article/details/82859577
https://github.com/alibaba/easyexcel/blob/master/quickstart.md
到此這篇關(guān)于阿里的Easyexcel讀取Excel文件(最新版本)的文章就介紹到這了,更多相關(guān)阿里的Easyexcel讀取Excel文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Mybatis如何實(shí)現(xiàn)多個(gè)控制條件查詢
這篇文章主要介紹了使用Mybatis如何實(shí)現(xiàn)多個(gè)控制條件查詢,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
從log4j切換到logback后項(xiàng)目無法啟動(dòng)的問題及解決方法
這篇文章主要介紹了從log4j切換到logback后項(xiàng)目無法啟動(dòng)的問題及解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-01-01
SpringBoot可視化接口開發(fā)工具magic-api的簡單使用教程
作為Java后端開發(fā),平時(shí)開發(fā)API接口的時(shí)候經(jīng)常需要定義Controller、Service、Dao、Mapper、XML、VO等Java對(duì)象。有沒有什么辦法可以讓我們不寫這些代碼,直接操作數(shù)據(jù)庫生成API接口呢?今天給大家推薦一款工具magic-api,來幫我們實(shí)現(xiàn)這個(gè)小目標(biāo)!2021-06-06

