alibaba / easyexcel

快速、简洁、解决大文件内存溢出的java处理Excel工具
https://easyexcel.opensource.alibaba.com
Apache License 2.0
32k stars 7.49k forks source link

在Ubuntu24.04LTS中, `EasyExcel.read`无法在指定泛型的监听器上工作 #3892

Open hotdogc1017 opened 1 month ago

hotdogc1017 commented 1 month ago

触发场景描述

按照文档中的示例,我以方法2的方式读取数据,但没有任何效果。以下是最小复现:

public static void main(String[] args) {
        @Data
        class Test {
            @ExcelProperty(index = 0)
            String partNo;
            @ExcelProperty(index = 1)
            String brand;
        }
        EasyExcel.read("/home/hotdog/桌面/缩减后.xlsx", new AbstractIgnoreExceptionReadListener<Test>() {
            @Override
            public void invokeHead(Map headMap, AnalysisContext context) {
            }
            @Override
            public void invoke(Test data, AnalysisContext context) {
                System.out.println(data);  // 没有打印任何数据
            }
            @Override
            public void doAfterAllAnalysed(AnalysisContext context) {
            }
        }).sheet().doRead();
    }

虽然和示例代码略有不同,但应该不是造成问题的关键。

此时如果我忽略AbstractIgnoreExceptionReadListener中的泛型:

public static void main(String[] args) {
        @Data
        class Test {
            @ExcelProperty(index = 0)
            String partNo;
            @ExcelProperty(index = 1)
            String brand;
        }
        EasyExcel.read("/home/hotdog/桌面/缩减后.xlsx", new AbstractIgnoreExceptionReadListener() {
            @Override
            public void invokeHead(Map headMap, AnalysisContext context) {
            }
            @Override
            public void invoke(Object data, AnalysisContext context) {
                System.out.println(data);  // 成功打印数据
            }
            @Override
            public void doAfterAllAnalysed(AnalysisContext context) {
            }
        }).sheet().doRead();
    }

成功读取到数据,但格式看起来像是一个Map

{0=P6KE75CA, 1=LEIDITECH(雷卯)} // 文件中的数据
hotdogc1017 commented 1 month ago

还有一个觉得可以再小小优化一下的点,就是简化一下读取文件的写法或者提供多种写法。在首次使用EasyExcel时,通常考虑的是读取一个格式简单、数据量少、只有一个sheet的Excel文件,以适应语法直觉。大多数REST API以对象的形式封装和配置,这样写的好处之一是可以渐进式的使用(可选的配置),也能更加直观的了解整体的结构和功能。这里有个polyfill:

// 可以指定泛型
ExcelReader<Foo> reader = new ExcelReader<>("文件目录", "文件名");  // or reader = new ExcelReader<>("文件路径");
// 传入一个消费者
reader.read(data -> {
    // do something
});

// end

还可以指定一些配置,比如·:

// 限制最大读取数量
reader.setMaxReadCount(10);
// 限制读取频率。单位: 毫秒
reader.setDelay(2000); // 或者指定单位: reader.setReadDelay(2, TimeUnit.SECONDS); 
// ....more