SpringBoot结合easyexcel处理Excel文件

原创/朱季谦

假如有这样一个需求,每天需要读取以下表头的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;
     }

   }
 }
相关推荐
阿俊-全栈开发5 小时前
LikeShop 单商户SaaS商城分销模块二开:佣金计算与结算逻辑实现
java·开发语言·微服务·likeshop·likeshop开源商城·likeshop多商户
wuminyu9 小时前
C++协程实现接收端的零拷贝Buffer管理原理剖析
java·linux·c语言·jvm·c++
Zhou14113610 小时前
SpringBoot_03_Web开发
前端·spring boot·python
蜗牛互联网11 小时前
WSL Containers GA:本地AI容器的生命周期、网络与治理验收
java·网络·人工智能·后端
龙亘川11 小时前
铭记英烈守初心,数字强基促服务:亘川智城退役军人服务系统的实践与价值
java·数据库·人工智能
OxYGC12 小时前
[AI工程] Spring AI 第廿一篇:存量 REST 接口的 MCP 化改造实录——工具从哪条路径注册、参数描述怎么写、身份怎么过去
java·人工智能·spring
Zhou14113612 小时前
SpringBoot_02_自动配置原理
java·spring boot·后端
FYKJ_201012 小时前
SSM校园失物招领系统41452-计算机课程设计、毕业设计
java·vue.js·spring boot·python·mysql·typescript·spark
kv11012 小时前
Android studio国内开发有关
java·数据库·android studio
卓怡学长13 小时前
w198基于springboot始于足下健康打卡平台的设计与实现
java·spring boot·spring·intellij-idea