转载: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);
本文详细介绍如何使用EasyExcel库进行Excel文件的读写操作,包括实体类注解的使用,同步与异步读取方法,以及如何处理大量数据以减少内存消耗。同时,提供了具体的代码示例和数据转换技巧。
2万+

被折叠的 条评论
为什么被折叠?



