EasyExcel的简单使用

easyexcel-好用的java Excel工具 好用的java Excel工具,代替poi easyexcel重写了poi对07版Excel的解析,能够原本一个3M的excel用POI sax依然需要100M左右内存降低到KB级别,并且再大的excel不会出现内存溢出,03版依赖POI的sax模式。在上层做了模型转换的封装,让使用者更加简单方便 立即下载

一 概述

        EasyExcel是一个基于Java的简单,省内存的读写Excel的开源项目。在尽可能节省内存的情况下支持读写百M的Excel。

        文档地址:EasyExcel 

        Github地址:https://github.com/alibaba/easyexcel

64M内存1分钟内读取75M(46W行25列)的Excel

当然还有急速模式能更快,但是内存占用会在100M多一点

二 实现Excel文件上传并读取指定列的数据

        pom

        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>5.0.0</version>
        </dependency>
        <!--<dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.11</version>
        </dependency>-->
        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.0.0</version>
        </dependency>
        <!-- <dependency>
             <groupId>org.apache.poi</groupId>
             <artifactId>poi-ooxml-schemas</artifactId>
             <version>3.11</version>
         </dependency>-->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.4</version>
        </dependency>
        <!--poi end-->
        <!--alibaba easyExcel start-->
        <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.10</version>
        </dependency>

        监听器

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.qskj.print.printcommon.entity.PrintLoanEntity;
import com.qskj.print.printcommon.exception.CommonException;
import com.qskj.print.printcommon.mapper.PrintLoanMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;

@Slf4j
public class ExcelDataListener extends AnalysisEventListener<ExcelColumn> {
    
    /**
     * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
     */
    private static final int BATCH_COUNT = 5;

    List<ExcelColumn> excelDataList = new ArrayList<>();

    /**
     * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没            用。
     */
    private DemoDAO demoDAO;

    public ExcelDataListener() {
       // 这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数
        demoDAO = new DemoDAO();
    }

    /**
     * 这个每一条数据解析都会来调用
     *
     * @param excelColumn
     * @param analysisContext
     **/
    @Override
    public void invoke(ExcelColumn excelColumn, AnalysisContext analysisContext) {

        excelDataList.add(excelColumn);
        // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
        if (list.size() >= BATCH_COUNT) {
            saveData();
            // 存储完成清理 list
            list.clear();
        }
    }
    /**
     * 所有数据解析完成了 都会来调用
     *
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 这里也要保存数据,确保最后遗留的数据也存储到数据库
        saveData();
        LOGGER.info("所有数据解析完成!");
    }
    /**
     * 加上存储数据库
     */
    private void saveData() {
        LOGGER.info("{}条数据,开始存储数据库!", list.size());
        demoDAO.save(list);
        LOGGER.info("存储数据库成功!");
    }
}
        if (excelDataList.size() >= BATCH_COUNT) {
            updateLoanData();
            //存储完清理list
            excelDataList.clear();
        }
    }

    /**
     * 所有数据解析完成了 都会来调用
     *
     * @param analysisContext
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        updateLoanData();
    }

    /**
     * 更新数据
     */
    private void updateLoanData() {
        log.info("更新数据方法!",);
    }
}

        指定列的下标或者列名

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.io.Serializable;

@Data
public class ExcelColumn implements Serializable {
    private static final long serialVersionUID = -5176115674290246277L;

    @ExcelProperty(index = 0)
    private String columnOne;

    @ExcelProperty(index = 8)
    private String columnEight;

    @ExcelProperty(index = 9)
    private String columnNine;
}

        service方法

    @Override
    public String importExcel(MultipartFile file) {

        String suffixExpect = "xlsx,xls";

        String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1);

        if (!suffixExpect.contains(suffix)) {
            throw new CommonException("请上传Excel文件,支持XLSX,XLS格式~");
        }

        try {
            EasyExcel.read(file.getInputStream(), ExcelColumn.class, new ExcelDataListener(/*Spring注入的实例*/)).sheet().doRead();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return "success";
    }

       Controller方法

@RequestMapping(value = "/supplierOrder/importExcel", method = RequestMethod.POST)
    public String InputExcel(@RequestParam("file") MultipartFile file) {
        return orderService.importExcel(file);
    }
easyexcel.rar 该Demo是基于官方示例编写的,使用Springboot(2.2.2.RELEASE)、Mybatis-Plus(3.1.2)、EasyExcel(2.1.6)和Thymeleaf前端框架,实现了web端的Excel导入导出功能,包括日期、数字的格式化以及自定义格式转换 立即下载

相关推荐

增量编码器资讯大全

增量编码器是什么 增量式编码器是将位移转换成周期性的电信号,再把这个电信号转变成计数脉冲,用脉冲的个数表示位移的大小,按照工作原理编码器可分为增量式和绝对式两类。 增量式编码器是将位移转换成周期性的电信号,再把这个电信号转变成计数脉冲,用脉冲的个数表示位移的大小。 编码器是把角位移或直线位移转换成电信号的一种装置。前者称为码盘,后者称码尺.按照读出方式编码器可以分为接触式和非接触式两种.接触式采...

kindele的博客 6009

阿里开源(EasyExcel)

阿里开源(EasyExcel) 1.官网与介绍 1.GitHub官网 GitHub地址:https://github.com/alibaba/easyexcel 使用文档地址https://alibaba-easyexcel.github.io/index.html 2.介绍 EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。Java领域解析、生成Excel比较有...

lin_dark的博客 3168

【毕业设计】_基于STM32单片机的按摩椅( 原理图+源码)

按摩器系统基于STM32单片机设计,作为核心控制单元。系统配备了OLED显示屏、蓝牙模块、喇叭模块、播报模块和光电感应模块。光电感应器用于检测是否有人接近,同时,系统可以通过蓝牙接收控制指令并执行相应的操作。该系统支持40℃的热敷功能以及气囊按摩功能,具备温度显示功能,并且可以通过按键切换不同的按摩模式。当光电感应器检测到有人时,按摩椅会自动启动。使用DHT11传感器的红色按钮可以调整温度。

2401_85381100的博客 724

SpringDataJpa建表时生成注释

org.hibernate.annotations.Table(appliesTo = "niu_user", comment = "用户信息表")@ApiModelProperty(value="用户名")

萤火虫草花星的博客 1287

来自工业界的知识库 RAG 服务(二),RagFlow 源码全流程深度解析

前面介绍过有道 QAnything 源码解析,通过深入了解工业界的知识库 RAG 服务,得到了不少调优 RAG 服务的新想法。因此本次趁热打铁,额外花费一点时间,深入研究了另一个火热的开源 RAG 服务RagFlow的完整实现流程,希望同样有所收获。首先依旧可以先从框架图入手,与常规的 RAG 架构进行一些比较可以看到右侧知识库被明显放大,同时最右侧详细介绍了文件解析的各种手段,比如OCR等,这些在常规的 RAG 中可能会作为一个不起眼的。

易迟的专栏 2万+

银行数据仓库体系实践(3)--数据架构

狭义的数据仓库数据架构用来特指数据分布,广义的数据仓库数据架构还包括数据模型、数据标准和数据治理。即包含相对静态部分如元数据、业务对象数据模型、主数据、共享数据,也包含相对动态部分如数据流转、ETL、整合、访问应用和数据全生命周期管控治理。 数据架构层面通过数据分类、分层部署等手段,从非功能性视角将数据合理布局。通过整体架构管控和设计,支持业务操作类和管理分析类应用(系统),满足业...

acumen_leo的博客 7011

java.util.NoSuchElementException问题(关于在JPA自建表中使用@ApiModelProperty注解映射字段注释抛出的异常)

org.hibernate.dialect.MySQL5InnoDBDialect java.util.NoSuchElementException at java.util.Collections$EmptyIterator.next(Collections.java:4189) at com.github.biyanwen.comment.bean.CommentIntegrator.propertyComment(CommentIntegrator.java:94) at com.github.

qq_44371705的博客 412

避坑指南:汇川SV660N配合SOEM时,PDO映射与CiA402状态机那些容易出错的地方

本文深入解析汇川SV660N伺服驱动与SOEM主站在PDO动态映射和CiA402状态机切换中的常见问题,提供实战代码和调试技巧。重点解决PDO配置时序、状态机转换同步等关键难点,帮助工程师避免典型错误,实现稳定通信与控制。

weixin_30653023的博客 498

EasyExcel

github地址: https://github.com/alibaba/easyexcel 07版本 <dependencies> <!--xls 03--> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId>

weixin_55527293的博客 212

《数据结构》02-线性结构1 两个有序链表序列的合并

题目 本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列。 函数接口定义: List Merge( List L1, List L2 ); 其中List结构定义如下: typedef struct Node *PtrToNode; struct Node { ElementType Data; /* 存储结点数据 */ PtrToNode Next;...

叫我皮卡丘 7665

《Autosar_MCAL高阶配置》总目录_培训教程持续更新中...

《Autosar_MCAL高阶配置》总目录_培训教程持续更新中...

「汽车电子助手」的博客 1万+

阿里开源(EasyExcel)---导出EXCEL

一. 简介 导出是后台管理系统的常用功能,当数据量特别大的时候会内存溢出和卡顿页面,曾经自己封装过一个导出,POI百万级大数据量EXCEL导出采用了分批查询数据来避免内存溢出和使用SXSSFWorkbook方式缓存数据到文件上以解决下载大文件EXCEL卡死页面的问题。不过一是存在封装不太友好使用不方便的问题,二是这些poi的操作方式仍然存在内存占用过大的问题,三是存在空循环和...

请叫我猿叔叔的博客 5万+

HFSS实战项目——基片集成波导(SIW)带通滤波器

设计了一款直接耦合的SIW带通滤波器, 采用直接耦合的形式, 工作频率覆盖19~21 GHz, 通带内插入损耗小于1.5 dB, 回波损耗小于-20 dB, 带外抑制特性良好.

2401_87464239的博客 4897

easyexcel简单使用

EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。github地址: https://github.com/alibaba/easyexcel官方文档: https://www.yuque.com/easyexcel/doc/easyexcel

杨某人的Java学习加油站 4859

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

EasyExcel入门小demo,简单理解EasyExcel

EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。该项目实现了列表数据的导入,分页列表导出,支持自定义格式,支持模版以及模板和列表的混合导出,小巧、简易、高性能。...

sadjoker2048的博客 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【JAVA ——EasyExcel的简单使用】

easyExcel 简单使用

Zhangyongqi77的博客 6634

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

EasyExcel简单使用

EasyExcel简单使用1.导入依赖2.写入Excel1.简单写入-方式一2.简单写入-方式二3.排除模板对象中的某些列4.按照顺序排列5.复杂头6.重复写到同一个excel的sheet标签中7.重复写到同一个excel的不同sheet标签中7.数字日期格式化8.插入图片-4种方式9.设置表格列宽和行高10.设置表格样式11.合并单元格3.读文件1.简单读文件-方式一2.简单读文件-方式二2.读一个excel的多个sheet--数据模板都一样3.读一个excel的多个sheet--数据模板不一样4.文件上

weixin_43994244的博客 3288

EasyExcel的简单读取操作

对应自己定义类去接收数据的字段,得到的数据就可以对其进行处理。记得把对应需要的T替换出来,和我们上传的表格是一样的。如何使用EasyExcel进行简单读取的操作。在此基础上我们通过定义监听器对文件流进行处理。在Controller中对其进行使用。

Demolist的博客 984

easyExcel 比poi 更加简单的 excel 解析工具

EasyExcel 写 excel 文件easyexcel 文档地址: https://easyexcel.opensource.alibaba.com/1 excel 的简单解析    ExcelRow 是自定义的用于接受一行数据的类,对应这一行数据的没一个字段或者说列登录后复制 @Test public...

weixin_33641311的博客 148

EasyExcel简单的写操作

usersList.add(new Users(2,"卢老师","男",28,"Java"));usersList.add(new Users(1,"张老师","男",36,"无"));users.add(new Users(2,"卢老师","男",28,"Java"));users.add(new Users(3,"王老师","女",32,"请假"));users.add(new Users(1,"张老师","男",36,"无"));//doWrite方法中的参数为具体数据。//关闭流,文件流手动关闭。

2401_87842592的博客 432

easyexcel 简单使用

&lt;dependency&gt; &lt;groupId&gt;com.alibaba&lt;/groupId&gt; &lt;artifactId&gt;easyexcel&lt;/artifactId&gt; &lt;version&gt;1.1.1&lt;/version&gt; &lt;/dependency&gt; FileUtil i

SakeOfWhat的博客 2975

使用easyExcel导出简单文档

使用easyExcel导出文档快速操作

hikarilee的博客 2260

EasyExcel简单实例

EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。 他能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能

机械工程跑路哥 1873
上一篇: HTTP传输大文件
下一篇: java.lang.NoClassDefFoundError: org/apache/poi/poifs/filesystem/FileMagic
至学者
博客等级 码龄9年 180粉丝 773原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值