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

用easyExcel如何实现?

要使提供的 ExcelModelListener 类来解析 Excel 文件并实现批量存储数据库的功能,需要结合 EasyExcel 库来读取 Excel 数据。具体来说,可以使用 EasyExcel.read() 方法来读取 Excel 文件,并指定 ExcelModelListener 作为事件监听器。

下面是调用 ExcelModelListener 进行 Excel 文件解析的完整示例代码:

1. 首先,确保已经添加了 EasyExcel 依赖

如果你还没有在 Maven 项目中引入 EasyExcel,可以在 pom.xml 文件中添加如下依赖:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.0.5</version> <!-- 确保使用最新版本 -->
</dependency>

2. 调用 ExcelModelListener 的代码

假设你有一个 Excel 文件 data.xlsx,并且 ExcelMode 是与 Excel 数据对应的 Java 类,你可以按照以下步骤来调用监听器解析 Excel 文件:

ExcelMode 类示例(简化版)
package com.zh.oukele.model;

public class ExcelMode {

    private String field1;
    private String field2;
    // 这里是你Excel中每一列的对应字段

    // 省略getter和setter
}
使用 ExcelModelListener 解析 Excel 文件
package com.zh.oukele;

import com.alibaba.excel.EasyExcel;
import com.zh.oukele.listener.ExcelModelListener;
import com.zh.oukele.model.ExcelMode;

import java.io.File;

public class ExcelImportService {

    public static void main(String[] args) {
        String fileName = "path/to/your/excel/data.xlsx"; // Excel 文件路径

        // 调用 EasyExcel 来读取文件
        EasyExcel.read(fileName, ExcelMode.class, new ExcelModelListener())
                .sheet()
                .doRead();
    }
}

3. 代码解析

  • EasyExcel.read(fileName, ExcelMode.class, new ExcelModelListener()):

    • 这行代码调用了 EasyExcel 的读取方法,指定了 Excel 文件的路径 fileName,以及用于解析 Excel 数据的 Java 类 ExcelMode
    • ExcelModelListener 被传递给 EasyExcel 作为事件监听器,这样 EasyExcel 在读取每一行数据时,就会调用 ExcelModelListener 中的 invoke() 方法。
  • .sheet():

    • 该方法指定读取 Excel 文件中的一个 sheet(工作表)。如果 Excel 文件有多个 sheet,你可以指定其他 sheet,比如 .sheet(1).sheet("sheetName")
  • .doRead():

    • 该方法触发实际的 Excel 数据读取操作。

4. ExcelModelListener 的工作流程

  • 逐行读取数据

    • ExcelModelListenerinvoke() 方法会在每一行数据被读取时被调用。你可以在这个方法中处理每一行的数据,例子中是将数据存储到 list 中。
  • 批量处理

    • 每当读取的数据达到设定的批量大小(如 BATCH_COUNT = 5),就会调用 saveData() 方法将数据存储到数据库中,之后清空 list
  • 全部数据解析完成后

    • doAfterAllAnalysed() 会在 Excel 文件解析完成后被调用,通常用于进行一些收尾操作,比如存储最后一批数据或释放资源。

5. 完整代码示例

假设 Excel 文件中有两列数据(如 field1field2),以下是完整的代码示例:

ExcelMode.java
package com.zh.oukele.model;

public class ExcelMode {

    private String field1;
    private String field2;

    // Getter 和 Setter 方法
    public String getField1() {
        return field1;
    }

    public void setField1(String field1) {
        this.field1 = field1;
    }

    public String getField2() {
        return field2;
    }

    public void setField2(String field2) {
        this.field2 = field2;
    }

    @Override
    public String toString() {
        return "ExcelMode{" +
                "field1='" + field1 + '\'' +
                ", field2='" + field2 + '\'' +
                '}';
    }
}
ExcelModelListener.java(主要的类)
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> {

    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());
        // 这里你可以将 list 中的数据存入数据库
        System.out.println("存储数据库成功!");
    }
}
ExcelImportService.java(调用和执行)
package com.zh.oukele;

import com.alibaba.excel.EasyExcel;
import com.zh.oukele.listener.ExcelModelListener;
import com.zh.oukele.model.ExcelMode;

public class ExcelImportService {

    public static void main(String[] args) {
        String fileName = "path/to/your/excel/data.xlsx"; // Excel 文件路径

        // 调用 EasyExcel 来读取文件
        EasyExcel.read(fileName, ExcelMode.class, new ExcelModelListener())
                .sheet()
                .doRead();
    }
}

总结

  • 你通过 EasyExcel.read() 读取 Excel 文件,并且指定 ExcelModelListener 作为事件监听器。
  • ExcelModelListener 会处理每一行数据,当达到设定的批量大小时进行批量存储。
  • 数据解析完成后,可以通过 doAfterAllAnalysed() 做一些收尾操作。

这个流程非常适合处理大量数据的 Excel 文件,能够在保证内存高效的同时,还能进行批量数据的持久化操作。


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

相关文章:

  • 在大型语言模型(LLM)框架内Transformer架构与混合专家(MoE)策略的概念整合
  • 游戏引擎学习第100天
  • NO.12十六届蓝桥杯备战|关系操作符|操作符连用|浮点数比较|练习2道(C++)
  • 分享在职同时准备系统分析师和教资考试的时间安排
  • vue 主子表加校验问题
  • 文理医院预约挂号系统的设计与实现(代码+数据库+LW)
  • 青少年编程与数学 02-009 Django 5 Web 编程 08课题、数据库操作
  • qt 控件的焦点事件
  • web前端第三次作业
  • 32单片机学习记录3之基本外设的使用
  • 解析RK3588无线边缘盒子为工业自动化边缘推理带来的 AI 突破
  • ComfyUI流程图生图原理详解
  • halcon三维点云数据处理(十四)在3D场景中去除背景的三种方式
  • [SAP ABAP] OO ALV报表练习1
  • 算法与数据结构(合并两个有序数组)
  • OpenCV2D 特征框架 (24)处理矩形框集合函数groupRectangles()的使用
  • 免费体验,一键部署!Alaya NeW应用市场正式上线DeepSeek系列模型
  • Linux零基础快速入门(非常详细),全覆盖Linux的基础知识,看完这一篇就够了。
  • 基于CanMV IDE 开发软件对K210图像识别模块的开发
  • 基于单片机的仓库安防系统(论文+源码)
  • (篇六)基于PyDracula搭建一个深度学习的软件之新版本ultralytics-8.3.28调试
  • 机器学习 - 机器学习模型的评价指标
  • HackerRank C++面试,中等难度题目 - Attribute Parser
  • 【C++高并发服务器WebServer】-18:事件处理模式与线程池
  • 基于Java的分布式系统架构设计与实现
  • Kafka的ISR是什么,HW是什么,怎么保证可靠性,Kafka怎么实现顺序消息?为什么Kafka的broker上的topic越多,效率越慢?