SpringBoot結合easyexcel處理Excel文件

文/朱季謙

假如有這樣一個需求,每天需要讀取以下表頭的Excel文件,統計文件裏擊中黑名單的比例,該文件is_blacklist列的1表示擊中了黑名單,0表示未擊中黑名單。
image

基於該需求,可以在定時任務通過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();

這裏創建一個名爲 listenerBlackTitleListener 對象,在該對象裏,可以監聽讀取每一行數據的操作。調用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;
     }

   }
 }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章