alibaba / easyexcel

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

获取大数据量文件的指定行(如10000至10200行)时,控制台提示com.alibaba.excel.cache.Ehcache - Cache misses count:xxx。无法获取表中数据。 #3944

Closed hengyizhi closed 1 month ago

hengyizhi commented 1 month ago

异常代码

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ExcelReader {

    public static void main(String[] args) {
        String fileName = "E:\\\\测试数据\\Daas账单100W.xlsx";
        readExcelFile(fileName);
    }

    public static void readExcelFile(String fileName) {
        // 创建一个监听器
        AnalysisEventListener<Map<Integer, String>> listener = new AnalysisEventListener<Map<Integer, String>>() {
            private List<String> headList = new ArrayList<>();
            private List<Map<Integer, String>> dataRows = new ArrayList<>();

            @Override
            public void invoke(Map<Integer, String> data, AnalysisContext context) {
                Integer rowIndex = context.readRowHolder().getRowIndex();
                if (rowIndex == 1) {
                    // 读取表头
                    headList = new ArrayList<>(data.values());
                } else if (rowIndex >= 10000 && rowIndex <= 10200) {
                    // 读取指定行的数据
                    dataRows.add(new HashMap<>(data));
                }
            }

            @Override
            public void doAfterAllAnalysed(AnalysisContext context) {
                // 打印表头
                System.out.println("表头:" + headList);

                // 打印指定行的数据
                for (Map<Integer, String> rowData : dataRows) {
                    System.out.println(rowData);
                }
            }
        };

        // 读取 Excel 文件
        EasyExcel.read(fileName)
                .headRowNumber(1) // 指定表头行数
                .registerReadListener(listener)
                .sheet() // 指定工作表,如果是第一个工作表可以不写
                .doRead();
    }
}

异常提示

17:06:29.511 [main] DEBUG com.alibaba.excel.cache.Ehcache - Cache misses count:1 17:06:30.188 [main] DEBUG com.alibaba.excel.cache.Ehcache - Cache misses count:1001 17:06:30.295 [main] DEBUG com.alibaba.excel.cache.Ehcache - Cache misses count:2001 17:06:30.391 [main] DEBUG com.alibaba.excel.cache.Ehcache - Cache misses count:3001 17:06:30.479 [main] DEBUG com.alibaba.excel.cache.Ehcache - Cache misses count:4001 17:06:30.554 [main] DEBUG com.alibaba.excel.cache.Ehcache - Cache misses count:5001 17:06:30.626 [main] DEBUG com.alibaba.excel.cache.Ehcache - Cache misses count:6001 17:06:30.702 [main] DEBUG com.alibaba.excel.cache.Ehcache - Cache misses count:7001 17:06:30.762 [main] DEBUG com.alibaba.excel.cache.Ehcache - Cache misses count:8001 17:06:30.827 [main] DEBUG com.alibaba.excel.cache.Ehcache - Cache misses count:9001

问题描述

针对大数据量、不同格式的excel,原需求是通过这个demo打印出表头(默认为第1行)和指定范围的数据(如10000行至10200行);但是一直提示Cache misses count:xx。 这种情况该如何解决?