我是靠谱客的博主 眼睛大电脑,这篇文章主要介绍alibaba EasyExcel简单读取Excel(去掉空行数据)实战,开箱即用,现在分享给大家,希望可以做个参考。

本文大概内容之前文章提过,不再赘述。直接上代码,开箱即用。

复制代码
1
2
3
4
5
<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.1.0</version> </dependency>
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import com.alibaba.excel.EasyExcelFactory; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.read.listener.PageReadListener; import com.alibaba.excel.util.ListUtils; import org.apache.commons.lang3.StringUtils; import java.io.File; import java.lang.reflect.Field; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import java.util.Set; import java.util.function.Consumer; import java.util.stream.Collectors; public class ReadExcelUtils { public static <T> List<T> readExcel(File excelFile, Class<T> entityClass) { List<T> data = new LinkedList<>(); EasyExcelFactory.read(excelFile, entityClass, new ReadListener<T>(data::addAll)).sheet().doRead(); return data; } } class ReadListener<T> extends PageReadListener<T> { private List<T> cache = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); private final Consumer<List<T>> consumer; public ReadListener(Consumer<List<T>> consumer) { super(consumer); this.consumer = consumer; } @Override public void invoke(T data, AnalysisContext context) { // 如果一行Excel数据均为空值,则不装载该行数据 if (lineNull(data)) { return; } cache.add(data); if (cache.size() >= BATCH_COUNT) { consumer.accept(cache); cache = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); } } @Override public void doAfterAllAnalysed(AnalysisContext context) { if (cache == null || cache.isEmpty()) { return; } consumer.accept(cache); } boolean lineNull(T line) { if (line instanceof String) { return StringUtils.isEmpty((String) line); } try { Set<Field> fields = Arrays.stream(line.getClass().getDeclaredFields()).filter(f -> f.isAnnotationPresent(ExcelProperty.class)).collect(Collectors.toSet()); for (Field field : fields) { field.setAccessible(true); if (field.get(line) != null) { return false; } } return true; } catch (Exception ignored) { } return true; } }

目前针对EasyExcel v3.1.0及最新的v3.1.1发现一个诡异的bug

在读取的返回类型的实体类<T>中,若最后一行单元格为空值,且该Java属性field1的下方定义一个未被@JSONField修饰的属性field2(或多个),此时在field2后面定义属性field3,且被@JSONField修饰。通常field3的值处理为null。未找到解决执法,请高人指点!

最后

以上就是眼睛大电脑最近收集整理的关于alibaba EasyExcel简单读取Excel(去掉空行数据)实战,开箱即用的全部内容,更多相关alibaba内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部