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

概述

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

<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(去掉空行数据)实战,开箱即用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部