阿里的Easyexcel讀取Excel文件(最新版本)
本篇文章主要介紹一下使用阿里開源的Easyexcel工具處理讀取excel文件,因為之前自己想在網上找一下這個簡單的立即上手的博客,發現很多文章的教程都針對比較舊的版本的Easyexcel,沒有使用新版本的方法,導致很多方法都標誌過期了或者運行時報錯,所以本篇博客主要是使用最新版的Easyexcel去讀取excel文件,順便說一下目前新版本的特性。
優化
- 目前讀取excel文件不再需要指定
ExcelTypeEnum
,即excel的版本,會自動處理 - 之前創建
ExcelReader
都是自己new,現在是通過EasyExcelFactory
創建,更加簡單和具備通用性。 - 之前每解析一行的回調的
invoke()
方法,通用對象Object是list
集合,目前是HashMap
集合。
簡單使用讀取Excel,返回List集合
- 通過maven引入依賴
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.0.5</version>
</dependency>
- 新建通用監聽類
StringExcelListener
/**
* StringList 解析監聽器
*
* @author zhangcanlong
* @since 2019-10-21
*/
private static class StringExcelListener extends AnalysisEventListener {
/**
* 自定義用於暫時存儲data
* 可以通過實例獲取該值
*/
private List<List<String>> datas = new ArrayList<>();
/**
* 每解析一行都會回調invoke()方法
*
* @param object 讀取後的數據對象
* @param context 內容
*/
@Override
public void invoke(Object object, AnalysisContext context) {
@SuppressWarnings("unchecked") Map<String, String> stringMap = (HashMap<String, String>) object;
//數據存儲到list,供批量處理,或後續自己業務邏輯處理。
datas.add(new ArrayList<>(stringMap.values()));
//根據自己業務做處理
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
//解析結束銷毀不用的資源
//注意不要調用datas.clear(),否則getDatas為null
}
/**
* 返回數據
*
* @return 返回讀取的數據集合
**/
public List<List<String>> getDatas() {
return datas;
}
/**
* 設置讀取的數據集合
*
* @param datas 設置讀取的數據集合
**/
public void setDatas(List<List<String>> datas) {
this.datas = datas;
}
}
- 創建
ExcelReader
讀取,並從監聽類中獲取讀取的數據
/**
* 根據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結尾
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("讀取結果:" + 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 {
/**
* 根據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 解析監聽器
*
* @author zhangcanlong
* @since 2019-10-21
*/
private static class StringExcelListener extends AnalysisEventListener {
/**
* 自定義用於暫時存儲data
* 可以通過實例獲取該值
*/
private List<List<String>> datas = new ArrayList<>();
/**
* 每解析一行都會回調invoke()方法
*
* @param object 讀取後的數據對象
* @param context 內容
*/
@Override
public void invoke(Object object, AnalysisContext context) {
@SuppressWarnings("unchecked") Map<String, String> stringMap = (HashMap<String, String>) object;
// 這裡可以獲取excel的基本信息,包含excel的總行數
System.out.println("不一定十分準確的總行數:"+context.getTotalCount());
//數據存儲到list,供批量處理,或後續自己業務邏輯處理。
datas.add(new ArrayList<>(stringMap.values()));
//根據自己業務做處理
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
//解析結束銷毀不用的資源
//注意不要調用datas.clear(),否則getDatas為null
}
/**
* 返回數據
*
* @return 返回讀取的數據集合
**/
public List<List<String>> getDatas() {
return datas;
}
/**
* 設置讀取的數據集合
*
* @param datas 設置讀取的數據集合
**/
public void setDatas(List<List<String>> datas) {
this.datas = datas;
}
}
}
參考:
- //blog.csdn.net/alinyua/article/details/82859577
- //github.com/alibaba/easyexcel/blob/master/quickstart.md