概述
本文大概内容之前文章提过,不再赘述。直接上代码,开箱即用。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.0</version>
</dependency>
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 EasyExcel简单读取Excel(去掉空行数据)实战,开箱即用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复