文/朱季謙
假如有這樣一個需求,每天需要讀取以下表頭的Excel文件,統計文件裏擊中黑名單的比例,該文件is_blacklist列的1表示擊中了黑名單,0表示未擊中黑名單。
基於該需求,可以在定時任務通過easyexcel工具進行處理。
一、首先需要在SpringBoot引入easyexcel的maven依賴
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.1</version>
</dependency>
二、定義一個接收Excel文件表頭列數據的Java Bean——
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class BlackTitle {
@ExcelProperty(value = {"key"})
private String key;
@ExcelProperty(value = {"is_blacklist"})
private String is_blacklist;
}
這注解@ExcelProperty是easyexcel包的註解,起到的作用是,例如可以將private String key通過 @ExcelProperty(value = {"key"})映射到表格的key值。簡單理解,就是每一個BlackTitle對象,能接收到表格每一行到數據,表格的key列值映射到BlackTitle的熟悉key值,表格的is_blacklist列值映射到BlackTitle的熟悉is_blacklist值。
三、繼承EasyExcel 框架中的 AnalysisEventListener
接口的類 BlackTitleListener
,用於監聽並處理 Excel 文件中的數據行。
當EasyExcel解析每一行數據時,這個invoke
方法就會被調用,該BlackTitleListener類裏的重寫方法實現將當前讀取的行數據添加到 data
列表中。該類最後提供了一個 getData()
方法,用於返回解析出來的數據列表,即集合data——
public static class BlackTitleListener extends AnalysisEventListener<BlackTitle> {
private List<BlackTitle> data = new ArrayList<>();
@Override
public void invoke(BlackTitle blackTitle, AnalysisContext analysisContext) {
data.add(blackTitle);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
public List<BlackTitle> getData(){
return data;
}
}
四、實現讀取Excel文件的sheet表格——
String source = "C:\\Users\\Admin\\Desktop\\blacklist.xlsx";
BlackTitleListener listener = new BlackTitleListener();
//讀取 Excel 文件的第一個 sheet 中的數據,並將其轉換成 BlackTitle 對象,最終存儲在 listener 對象中。
EasyExcel.read(source,listener).head(BlackTitle.class).sheet(0).headRowNumber(1).doReadSync();
這裏創建一個名爲 listener
的 BlackTitleListener
對象,在該對象裏,可以監聽讀取每一行數據的操作。調用EasyExcel.read(...)
方法去讀取Excel文件,通過 .head(BlackTitle.class)
設置表頭信息,即將表頭字段映射到BlackTitle類裏屬性。通過 .sheet(0)
指定要讀取第一個sheet表格數據。.headRowNumber(1)
表示表頭位於第一行(索引從 0 開始)。.doReadSync()
方法開始同步讀取 Excel 數據,然後將數據存儲到 listener
對象中。
五、獲取讀取存儲到集合裏的數據進行處理
獲取讀取到集合裏的數據——
List<BlackTitle> data = listener.getData();
接下來,就可以通過簡單的集合迭代來統計出表格is_blacklist列值爲1的比例了——
long blackSize = data.stream().filter(k->k.getIs_blacklist().equals("1")).count();
最後,完整代碼如下——
public class BlackTitleTest {
public static void main(String[] args) {
String source = "C:\\Users\\Admin\\Desktop\\blacklist.xlsx";
BlackTitleListener listener = new BlackTitleListener();
EasyExcel.*read*(source,listener).head(BlackTitle.class).sheet(0).headRowNumber(1).doReadSync();
List<BlackTitle> data = listener.getData();
long blackSize = data.stream().filter(k->k.getIs_blacklist().equals("1")).count();
}
public static class BlackTitleListener extends AnalysisEventListener<BlackTitle> {
private List<BlackTitle> data = new ArrayList<>();
@Override
public void invoke(BlackTitle blackTitle, AnalysisContext analysisContext) {
data.add(blackTitle);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
public List<BlackTitle> getData(){
return data;
}
}
}