使用 EasyExcel 读取Excel(两种方式)_headlinemun-程序员宅基地

转载:https://www.cnblogs.com/oukele/p/11443659.html

引入 jar 包

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>1.1.2-beta5</version>
        </dependency>

EasyExcel支持对实体类中的属性进行注解,方便后续进行读写操作。

 id 为 表头,index 代表的是 第0行

 @ExcelProperty(value="id",index=0)

新建一个 ExcelModel 实体(需要继承 BaseRowModel)

package com.zh.oukele.model;

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.metadata.BaseRowModel;

/**
 * 表格实体
 */
public class ExcelMode extends BaseRowModel {

    /**
     * 第一列的数据
     */
    @ExcelProperty(index = 0)
    private String column1;
    /**
     * 第二列的数据
     */
    @ExcelProperty(index = 1)
    private String column2;

    public void setColumn1(String column1) {
        this.column1 = column1;
    }

    public String getColumn1() {
        return column1;
    }

    public String getColumn2() {
        return column2;
    }

    public void setColumn2(String column2) {
        this.column2 = column2;
    }

    @Override
    public String toString() {
        return "ExcelMode{" +
                "column1='" + column1 + '\'' +
                ", column2='" + column2 + '\'' +
                '}';
    }
}

 

同步读取 ( 数据量大的时候,不推荐使用,内存消耗比较大  )

    // 简单读取 (同步读取)
    public static void simpleRead() {

        // 读取 excel 表格的路径
        String readPath = "C:\\Users\\oukele\\Desktop\\模拟数据.xlsx";

        try {
            // sheetNo --> 读取哪一个 表单
            // headLineMun --> 从哪一行开始读取( 不包括定义的这一行,比如 headLineMun为2 ,那么取出来的数据是从 第三行的数据开始读取 )
            // clazz --> 将读取的数据,转化成对应的实体,需要 extends BaseRowModel
            Sheet sheet = new Sheet(1, 1, ExcelMode.class);

            // 这里 取出来的是 ExcelModel实体 的集合
            List<Object> readList = EasyExcelFactory.read(new FileInputStream(readPath), sheet);
            // 存 ExcelMode 实体的 集合
            List<ExcelMode> list = new ArrayList<ExcelMode>();
            for (Object obj : readList) {
                list.add((ExcelMode) obj);
            }

            // 取出数据
            StringBuilder str = new StringBuilder();
            str.append("{");
            String link = "";
            for (ExcelMode mode : list) {
                str.append(link).append("\""+mode.getColumn1()+"\":").append("\""+mode.getColumn2()+"\"");
                link= ",";
            }
            str.append("};");
            System.out.println(str);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }


    }

 

异步读取

新建一个  ExcelModelListener 监听类出来,并且 继承 AnalysisEventListener 类

package com.zh.oukele.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.zh.oukele.model.ExcelMode;

import java.util.ArrayList;
import java.util.List;

/***
 *  监听器
 */
public class ExcelModelListener extends AnalysisEventListener<ExcelMode> {

    /**
     * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
     */
    private static final int BATCH_COUNT = 5;
    List<ExcelMode> list = new ArrayList<ExcelMode>();
    private static int count = 1;
    @Override
    public void invoke(ExcelMode data, AnalysisContext context) {
        System.out.println("解析到一条数据:{ "+ data.toString() +" }");
        list.add(data);
        count ++;
        if (list.size() >= BATCH_COUNT) {
            saveData( count );
            list.clear();
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        saveData( count );
        System.out.println("所有数据解析完成!");
        System.out.println(" count :" + count);
    }

    /**
     * 加上存储数据库
     */
    private void saveData(int count) {
        System.out.println("{ "+ count +" }条数据,开始存储数据库!" + list.size());
        System.out.println("存储数据库成功!");
    }

}

进行读取

 

    // 异步读取
    public static void simpleRead1(){

        // 读取 excel 表格的路径
        String readPath = "C:\\Users\\oukele\\Desktop\\模拟数据.xlsx";

        try {
            Sheet sheet = new Sheet(1,1,ExcelMode.class);
            EasyExcelFactory.readBySax(new FileInputStream(readPath),sheet,new ExcelModelListener());

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

    }

读取出来的日期 是 double 类型,转换一下

                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
                    Date date = HSSFDateUtil.getJavaDate(Double.parseDouble(mode.getColumn2()));
                    String time = sdf.format(date);
                    System.out.println(time);
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u010321349/article/details/106927491

智能推荐

Hadoop技术解析:分布式存储与计算_hadoop数据采集和存储-程序员宅基地

文章浏览阅读1k次,点赞37次,收藏17次。Hadoop是一个开源的分布式计算平台,用来处理大规模数据集。它基于Google的MapReduce算法和Google文件系统(GFS)的论文实现,通过分布式存储和计算来处理大规模数据。_hadoop数据采集和存储

CS-NP白蛋白包覆壳聚糖纳米颗粒/人血清白蛋白-磷酸钙纳米颗粒无机复合材料_静电吸附白蛋白纳米粒-程序员宅基地

文章浏览阅读182次。以人血清白蛋白修饰的上转换纳米颗粒为载体运输光敏性的多吡啶钌化合物,该体系具有双重荧光特性,用于细胞成像,而且能够通过光照控制释放;采用静电吸附的方法,在壳聚糖纳米粒子(CS-NP)表面包覆白蛋白,研究CS-NP修饰前后粒径,电位,稳定性的变化,并通过MTT法检测修饰前后CS-NP对MCF-7细胞的影响.结果BSA-CS-NP荷负电荷,稳定性提高,抑制效应增强.结论白蛋白修饰后作用增强.原因可能是白蛋白修饰后提高了壳聚糖纳米粒的稳定性,诱发细胞的内吞效应,作用增强.载纳米雄黄磁性白蛋白纳米球。......_静电吸附白蛋白纳米粒

python 脚本执行外部程序.exe关闭窗口程序(tcy)_update#setstate idle-程序员宅基地

文章浏览阅读9.2k次,点赞6次,收藏32次。说明:前面的部分用于打开外部程序.exe;win32gui用于关闭窗口程序(显示最大化最小化)Python调用(运行)外部程序 2019/3/7在Python中可在脚本中直接使用其他脚本或程序1 使用os.system(command)运行其他程序 :参数command 要执行的命令,相当于在Windows的cmd窗口中输入的命令。如果要向程序或者脚本传递参数,可以..._update#setstate idle

Springboot计算机毕业设计家政帮帮微信小程序【附源码】开题+论文+mysql+程序+部署-程序员宅基地

文章浏览阅读660次,点赞22次,收藏17次。具体而言,研究目的包括:设计并实现服务分类、订单完成、用户管理、服务信息发布、家政人员管理、预约信息管理等功能模块,确保用户能够方便地浏览和选择服务,实现快速预约和下单;我们将建立严格的信息审核机制,对家政人员发布的服务信息进行审核和筛选,确保信息的真实性和可靠性。首先,对家政服务行业进行深入的市场调研和需求分析,明确用户的需求和期望,为小程序的功能设计提供依据。此外,我们还将通过小程序收集用户数据和反馈信息,进行深入的数据分析,为家政服务行业的市场预测、决策支持和业务发展提供有力支持。

Labview Ethernetip TCP网口通讯欧姆龙PLC OmronNX1P2NJ501NJ301PLC标签通讯 CIP通讯比Fins通讯更完美_fins cip-程序员宅基地

文章浏览阅读549次,点赞7次,收藏10次。本文将从以下几个方面进行详细的讨论:自定义变量读写、Bool单点或数组读写、数字格式单个或数组读写、浮点数单个或数组读写,并通过实际测试验证程序的准确性。通过本文的学习,读者将能够更好地理解如何使用LabVIEW进行Ethernet/IP TCP网口通信,并更加灵活地与欧姆龙PLC进行通信。通过使用LabVIEW进行Ethernet/IP TCP网口通信与欧姆龙PLC的标签通信,我们能够更加灵活和方便地控制设备的状态和参数。相比传统的Fins通信,CIP通信具有更多的优势和功能,可以满足更多的应用需求。_fins cip

计算机视觉算法中的 相机姿态估计(Camera Pose Estimation)-程序员宅基地

文章浏览阅读2.5k次,点赞4次,收藏18次。另外,相机姿态估计是一个复杂的问题,还有其他更复杂的算法和方法可供选择,如PnP算法、EPnP算法、直接法(如ORB-SLAM)等。相机姿态估计,即相机位姿估计,是指通过计算机视觉算法来确定相机在世界坐标系中的位置和方向。一般情况下,我们可以将相机的姿态表示为一个4×4的变换矩阵,即相机的位姿矩阵。它通过检测图像中的特征点,并找到两幅图像之间对应的特征点,然后利用这些特征点的几何关系来估计相机的姿态。通过估计相机的姿态,可以根据相机的位置和朝向来确定虚拟对象的位置和姿态,从而实现虚拟对象与实际场景的融合。_相机姿态估计

随便推点

如何通过编程更改Windows 10用户文件夹的名称-程序员宅基地

文章浏览阅读34次。在Windows 10中,用户文件夹是每个用户帐户的主文件存储位置。用户文件夹的默认名称是用户的用户名。但是,有时候我们可能需要通过编程方式更改用户文件夹的名称。本文将介绍如何使用Python编程语言修改Windows 10用户文件夹的名称。此外,我们还需要更新注册表中的文件夹路径,以确保系统能够正确识别更改后的用户文件夹。首先,我们获取当前的用户名和用户文件夹路径。通过上述代码,您可以使用Python编程语言更改Windows 10用户文件夹的名称。函数将新的文件夹重命名为原有的用户名。

鸿蒙应用开发游戏(一)---大鱼吃小鱼(界面部署)_鸿蒙游戏开发教程-程序员宅基地

文章浏览阅读889次,点赞22次,收藏8次。你是否玩过古老而不失优雅的大鱼吃小鱼,小鱼的生存之路何尝不是我们这些打工人的写照,以前想用安卓写的,碰巧鸿蒙它来了,那就边学习边记录吧,这个游戏一共分为6篇,记录了鸿蒙App的第一步创建,申明式UI控件如何使用,简单动画的使用,方法的封装,变量的状态管理,点击事件的分发,页面的生命周期,钩子的使用,一些用法与安卓原生的对比等,也算是一个小完整的项目了。第一篇相对简单,只是简单的布局摆放,用的知识点是Stack布局,State状态管理,Entry入口,Component注解等1、创建项目2、项目结构。

tk.mybatis.mapper.MapperException: 无法获取实体类com.leyou.work.entity.Brand对应的表名!_tk.mybatis.mapper.mapperexception: 无法获取实体类com.ai.a-程序员宅基地

文章浏览阅读2.8k次。完整报错:tk.mybatis.mapper.mapperhelper.EntityHelper.getEntityTable(EntityHelper.java:69) ~[mapper-core-1.1.5.jar:na] at tk.mybatis.mapper.entity.Example.<init>(Example.java:103) ~[mapper-core-1.1..._tk.mybatis.mapper.mapperexception: 无法获取实体类com.ai.ai.pojo.aiapikey对应

计算机毕业设计springboot+vue基本微信小程序的剧本杀游戏设计与实现_vue开发微信小游戏-程序员宅基地

文章浏览阅读385次。首先,论文一开始便是清楚的论述了小程序的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了小程序的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设计。本项目软件架构选择B/S模式,总体功能模块运用自顶向下的分层思想。再然后就是实现系统并进行代码编写实现功能。论文的最后章节总结一下自己完成本论文和开发本项目的心得和总结。开发说明:前端使用微信微信小程序开发工具;_vue开发微信小游戏

计算机桌面颜色如何设置标准,教你把电脑屏幕设置成可以保护眼睛的颜色-程序员宅基地

文章浏览阅读1.4k次。点评:我们知道,长期使用电脑,眼睛盯着屏幕会使眼睛非常干涩、疲劳,所以现在流行将电脑设置成可以保护眼睛的颜色。我们知道,长期使用电脑,眼睛盯着屏幕会使眼睛非常干涩、疲劳,所以现在流行将电脑设置成可以保护眼睛的颜色。这两天人资部的MM问我如何给电脑设置成保护眼睛的颜色,其实,百度一下“保护眼睛的颜色设置”、“保护眼睛的电脑颜色”等关键词,就可以找到很多教授设置电脑为保护色的攻略,按照网上讲解的方法可..._电脑桌面颜色保护眼睛

CoppeliaSim实例分析系列-ABB IRB140(二)_feima1134.flv-程序员宅基地

文章浏览阅读1k次,点赞3次,收藏7次。CoppeliaSim实例分析系列-ABB IRB140(二)在CoppeliaSim实例分析系列-ABB IRB140(一)中,我们简单介绍了ABB IRB140实例的仿真环境设置,并添加了新的Non-thread Child Script来控制机器人。现在我们来深入讲解如何使用Non-thread Child Script来控制机器人。原版环境中的脚本编程顺序过于混乱,不方便学习,请大家下载我修改过的IRB140优化脚本。在开始之前,大家需要搞了解如下内容:简单掌握Lua语言的语法,请参考_feima1134.flv

推荐文章

热门文章

相关标签