要使提供的 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()
方法。
- 这行代码调用了 EasyExcel 的读取方法,指定了 Excel 文件的路径
-
.sheet()
:- 该方法指定读取 Excel 文件中的一个 sheet(工作表)。如果 Excel 文件有多个 sheet,你可以指定其他 sheet,比如
.sheet(1)
或.sheet("sheetName")
。
- 该方法指定读取 Excel 文件中的一个 sheet(工作表)。如果 Excel 文件有多个 sheet,你可以指定其他 sheet,比如
-
.doRead()
:- 该方法触发实际的 Excel 数据读取操作。
4. ExcelModelListener
的工作流程
-
逐行读取数据:
ExcelModelListener
的invoke()
方法会在每一行数据被读取时被调用。你可以在这个方法中处理每一行的数据,例子中是将数据存储到list
中。
-
批量处理:
- 每当读取的数据达到设定的批量大小(如
BATCH_COUNT = 5
),就会调用saveData()
方法将数据存储到数据库中,之后清空list
。
- 每当读取的数据达到设定的批量大小(如
-
全部数据解析完成后:
doAfterAllAnalysed()
会在 Excel 文件解析完成后被调用,通常用于进行一些收尾操作,比如存储最后一批数据或释放资源。
5. 完整代码示例
假设 Excel 文件中有两列数据(如 field1
和 field2
),以下是完整的代码示例:
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 文件,能够在保证内存高效的同时,还能进行批量数据的持久化操作。