当前位置: 首页 > article >正文

使用Hutool读取大Excel

改造后可以在数秒内读取百万级别量的excel数据,注意:csv不行,先转成excel再读取

public class MyBigExcelUtil {

    /**
     * 储存表头
     */
    private static List<Object> headLine;
    /**
     * 储存返回数据
     */
    private static List<Map<String, Object>> datas = new ArrayList<>();
    /**
     * 储存表头行号,默认是第0行
     */
    private static AtomicInteger headNo = new AtomicInteger(0);

    /**
     * 设置 表头 行号
     */
    public static void setHeadNo(int headNum) {
        headNo.set(headNum);
    }

    /**
     * @param pathAndName        文件路径
     * @param idOrRidOrSheetName Excel中的sheet id或者rid编号或sheet名称,rid必须加rId前缀,例如rId1,如果为-1处理所有编号的sheet
     */
    public static List<Map<String, Object>> readBigExcel(String pathAndName, int idOrRidOrSheetName) {
        datas.clear();
        Excel07SaxReader reader = new Excel07SaxReader(new MyRowHandler());
        reader.read(pathAndName, idOrRidOrSheetName);
        Console.log("【{}】 读取完成 ... ", pathAndName);
        return datas;
    }

    /**
     * @param pathAndName        文件路径
     * @param idOrRidOrSheetName Excel中的sheet id或者rid编号或sheet名称,rid必须加rId前缀,例如rId1,如果为-1处理所有编号的sheet
     * @param beanType           类类型
     * @param <T>                返回值为List<T>
     * @return
     */
    public static <T> List<T> read(String pathAndName, int idOrRidOrSheetName, Class<T> beanType) {
        return read(pathAndName, idOrRidOrSheetName, beanType, Collections.EMPTY_MAP);
    }

    /**
     * @param pathAndName        文件路径
     * @param idOrRidOrSheetName Excel中的sheet id或者rid编号或sheet名称,rid必须加rId前缀,例如rId1,如果为-1处理所有编号的sheet, 一般传0
     * @param beanType           类类型    映射成的实体类
     * @param fieldMapping       T类型对应的别名,即类类型对应的 excel 的关系   Map<excel列的名字, java中定义实体的字段名>
     * @param <T>                返回值为List<T>
     * @return
     */
    public static <T> List<T> read(String pathAndName, int idOrRidOrSheetName, Class<T> beanType, Map<String, String> fieldMapping) {
        CopyOptions copyOptions = CopyOptions.create();
        if (CollUtil.isNotEmpty(fieldMapping)) {
            copyOptions.setFieldMapping(fieldMapping);
        }
        readBigExcel(pathAndName, idOrRidOrSheetName);
        List<T> datalist = new ArrayList<>();
        for (Map<String, Object> data : datas) {
            T t = ReflectUtil.newInstanceIfPossible(beanType);
            datalist.add(BeanUtil.fillBeanWithMap(data, t, copyOptions));
        }
        return datalist;
    }

    /**
     * 行数据处理
     */
    private static class MyRowHandler implements RowHandler {
        @Override
        public void handle(int sheetIndex, long rowIndex, List<Object> rowList) {
            //Console.log("[{}] [{}] {}", sheetIndex, rowIndex, rowList);
            if (rowIndex < headNo.get()) {
                return;
            } else if (rowIndex == headNo.get()) {
                headLine = rowList;
            } else {
                Map<String, Object> tMap = new HashMap<>(rowList.size());
                for (int i = 0; i < headLine.size(); i++) {
                    Object key = headLine.get(i);
                    Object val = rowList.get(i);
                    tMap.put(key == null ? "" : key.toString(), val == null ? "" : val);
                }
                datas.add(tMap);
            }
        }
    }
}

http://www.kler.cn/a/413118.html

相关文章:

  • 命令行版 postman 之 post 小工具
  • 103.【C语言】数据结构之二叉树的三种递归遍历方式
  • Easy Excel 通过【自定义批注拦截器】实现导出的【批注】功能
  • Spring-Mybatis测试
  • 4.STM32之通信接口《精讲》之IIC通信---软件实现IIC《深入浅出》面试必备!
  • 自由学习记录(25)
  • C++学习日记---第14天(蓝桥杯备赛)
  • 前端实现把整个页面转成PDF保存到本地(DOM转PDF)
  • 梧桐数据库的高效索引技术分析
  • Rust语言俄罗斯方块(漂亮的界面案例+详细的代码解说+完美运行)
  • 前端框架 react 性能优化
  • 【网络安全设备系列】10、安全审计系统
  • 在WSL 2 (Ubuntu 22.04)安装Docker Ce 启动错误解决
  • 【H2O2|全栈】Node.js(1)
  • 5G Multicast/Broadcast Services(MBS) (五)
  • (计算机网络)期末
  • 在 Spring Boot 中构造 API 响应的最佳实践
  • 985研一学习日记 - 2024.11.23
  • pytest之收集用例规则与运行指定用例
  • nn.Upsample
  • linuxCNC(三)ini配置文件说明
  • 解决 S3 文件复制时的 “can‘t start new thread“ 错误
  • CListCtrl::InsertItem和临界区导致程序卡死
  • C++-qt经验
  • Android 桌面窗口新功能推进,聊一聊 Android 桌面化的未来
  • Unity 中 多种资源加载方式的优缺点