文章目录
可能最近和easyexcel比较有缘,上个月倒腾了导出,这个月就轮到了导入了~~
Excel读取实际上是很复杂的,比如问卷场景,涉及多级表头、不固定的列、各类格式(时间、数值等等),但是不用怕,这些在 官方网站上都能找到案例!
本文主要讲解web版不创建对象的导入excel通用版,解决了表格内容不固定和各个导入业务模块复用性!
背景知识介绍
本篇项目框架介绍:SpringBoot + MybatisPlus + EasyExcel + Knife4j
有数据对象读方式
创建类实现ReadListener
实现步骤为:
- 定义数据对象
DemoData,与Excel中row的每一列对应上 - 定义监听器
implements ReadListener,将每一行映射到List<DemoData>中 - 根据业务,存储
List<DemoData>
无额外实现类,since: 3.0.0-beta1
划重点:easyexcel版本需要在3.0.0-beta1及以上!!!
如下代码为:官方举例,其中DemoData为定义的数据对象,与Excel中的列对应。
String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
// 这里每次会读取100条数据 然后返回过来 直接调用使用数据就行
EasyExcel.read(fileName, DemoData.class, new PageReadListener<DemoData>(dataList -> {
for (DemoData demoData : dataList) {
log.info("读取到一条数据{}", JSON.toJSONString(demoData));
}
})).sheet().doRead();
不创建数据对象读方式
实现步骤为:
- 定义监听器
extends AnalysisEventListener<Map<Integer, String>> - 定义全局变量
Map<Integer, String> cachedDataList,将读取的每一行数据存储在该变量中 - 根据业务,存储
cachedDataList
实践
思路
- 定义抽象监听器
AbstractNoModelDataListener实现AnalysisEventListener<Map<Integer, String>>,构造函数中将业务处理接口及业务上下文参数初始化 - 定义抽象业务处理类
AbstractImportInterface,作为业务处理统一入口 - 定义具体业务处理类实现
AbstractImportInterface

抽象监听类
package com.lizzy.common.excel.utils;
import java.util.List;
import java.util.Map;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
/**
* EasyExcel不创建数据对象的读
*/
@Slf4j
public class AbstractNoModelDataListener extends AnalysisEventListener<Map<Integer, String>> {
/**
* 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收
*/
private static final int BATCH_COUNT = 5;
private List<Map<Integer, String>> cachedDataList = Lists.newArrayListWithExpectedSize(BATCH_COUNT);
private AbstractImportInterface importInterface;
pr

本文介绍了如何使用EasyExcel在不创建数据对象的情况下实现Excel的导入功能,通过创建抽象监听器和业务处理接口,实现了不同业务场景的复用。文章详细展示了从创建监听器到web端整合的完整步骤,适用于处理表格内容不固定的情况。

1792

被折叠的 条评论
为什么被折叠?



