使用easyExcel做一个简单的excel数据读取

前情

今天碰到个需要要做excel导入数据,用POI实在是太心累了,之前临时用过easyExcel,也没太用明白,今天好好看了一下,稍稍整理一下。

官方介绍

EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。 github地址:https://github.com/alibaba/easyexcel

文档地址:官方文档

引入依赖

官方文档里面写依赖。。。我还是自己去maven仓库搜索来的。。。

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.7</version>
        </dependency>

定义实体类

我是用的定义实体类的方法来实现的,官方文档里面也写了没有实例类对应的情况,我这边就用有实体类对应的方法来实现的。

/**
 * @Classname TestEntity
 * @Description TODO
 * @Date 2021/9/10 10:43
 * @Created by frank
 */
@Data
public class TestEntity {
    @ExcelProperty(index = 0)// index代表第几列,可以用列号匹配,也可以用列名(name)匹配
    private String type;//分类

    @ExcelProperty(index = 1)// index代表第几列,可以用列号匹配,也可以用列名(name)匹配
    private Integer weight;//权重

    @ExcelProperty(index = 2)// index代表第几列,可以用列号匹配,也可以用列名(name)匹配
    private String project;//检查考核项目

    @ExcelProperty(index = 3)// index代表第几列,可以用列号匹配,也可以用列名(name)匹配
    private String standard;//标准
}

定义监听器

我这边是有对应的实体类的,继承AnalysisEventListener的时候,需要申明泛型。

/**
 * @Classname ExcelListListener
 * @Description TODO
 * @Date 2021/9/10 10:37
 * @Created by frank
 */
@Slf4j
// 有个很重要的点 ExcelListListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
public class ExcelListListener extends AnalysisEventListener<TestEntity> {

    private List<TestEntity> dataList= new ArrayList<>();
    // 我这边需要对读取的数据,整体进行处理,所以我就通过构造函数传进来一个数组,来接收读取到的数据
    public AssessmentRulesListener(List<AssessmentRules> dataList) {
        this.dataList = dataList;
    }

	// 假设需要用到一个DemoDAO,当然这边也是可以写service的,看你实际需要什么
	private DemoDAO demoDAO;
	
	// 在使用到监听器的时候,可以通过监听器的构造函数来把spring管理的类传进来
//    public ExcelListListener(DemoDAO demoDAO) {
//		this.demoDAO= demoDAO;
//    }

    @Override
    // easyExcel是一条条读取数据的,读取一条处理一条,下面这个函数就写一些读取数据时需要做的一些处理,一些判空处理啊,数据有效性验证都可以放这边来写
    public void invoke(TestEntity entity, AnalysisContext analysisContext) {
    	// 我这边写的比较简单,我只要读数据,那我就直接放入一个list里面了
        if (entity != null) {
            objectList.add(entity);
            log.info("数据读取成功:" + entity.toString());
        }
    }

    @Override
    // 下面是写一些读取结束前需要做的事情,在所有数据解析完成后,都会来调用
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        log.info("共有数据:" + objectList.size() + "条");
    }
}

注意点:
监听器不能被spring管理,每次读取的时候需要new一下,如果需要在监听器里面用到别的service或者Dao的时候,需要在监听器的构造函数里面传进去。

写个测试

/**
 * @Classname TestController
 * @Description TODO
 * @Date 2021/9/10 10:36
 * @Created by frank
 */
@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {

    @RequestMapping("/read")
    public void readTest(@RequestParam MultipartFile file) {
        ExcelReader excelReader = null;
        try {
	        //把前端传来的文件转成输入流
            InputStream inputStream = file.getInputStream();
            // 初始化对象
            excelReader = EasyExcel.read(inputStream, TestEntity.class, new ExcelListListener()).build();
            // 指定读取哪一个sheet
            ReadSheet readSheet = EasyExcel.readSheet(0).build();
            // 开始读取
            excelReader.read(readSheet);
        } catch (IOException e) {
            log.error("文件错误!");
        } finally {
            if (excelReader != null) {
                // 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
                excelReader.finish();
            }
        }
    }
}

测试一下

在这里插入图片描述
OK了!非常简单!用的时候也百度了很多easyExcel的使用的博客,人家那边还有很厉害的工具类,我先慢慢啃一下,啃完了我再来更新~~

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值