目录
读出Excel文档
写入Excel文档
读出Excel文档
使用EasyExcel读取Excel文件: 需要在maven项目中导入EasyExcel依赖
<!-- EasyExcel依赖包 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.6</version>
</dependency>
接下来我们创建一个excle文件,名称为abc.xlsx.
填充如下内容:
根据Excel创建实体对象
@Data
public class abc {
public String str;
public String date;
public int num;
}
然后我们需要创建一个监视器对象,用来处理读取到数据.
package com.example.station.util;
import cn.hutool.core.collection.ListUtil;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.example.station.model.Excel.abc;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.ListUtils;
import javax.servlet.ReadListener;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
// 自定义监听器
// 继承 AnalysisEventListener 类, 传入需要监听的对象类型abc,重写其中的方法
// 这里只需要重写 invoke() 和 doAfterAllAnalysed() 方法即可
@Slf4j
public class abclistener extends AnalysisEventListener<abc> {
private static final int BATCH_COUNT = 10;
private List<abc> cacheDataAbc = new ArrayList<>(BATCH_COUNT);
// 这个方法在每一条数据解析完之后会调用
// 这里可以对数据进行处理
//
@Override
public void invoke(abc abc, AnalysisContext analysisContext) {
log.info("解析到一条数据:{}", abc);
cacheDataAbc.add(abc);
if (cacheDataAbc.size() >= BATCH_COUNT) {
// 处理缓存的数据,当达到了限定的条数,可以批量插入数据库
log.info("开始处理缓存数据");
cacheDataAbc.clear();
// 这里可以调用service层进行数据插入
}
}
// 这个方法在所有数据解析完成之后会调用
// 这里可以进行一些善后工作,比如关闭流等
//
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
log.info("所有数据解析完成");
}
}
接下来我们就可以进行读取代码编写了:
package com.example.station.util;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.EasyExcelFactory;
import com.example.station.model.Excel.abc;
public class ExcelUtil {
public static void main(String[] args) {
String fileName = "C:\\Users\\Administrator\\Desktop\\abc.xlsx";
// 读取Excel文件
// 这里的abc.class是你要读取的实体类
// new abclistener()是读取监听器
// 这里的sheet()方法是指定读取的sheet页,默认是第1个
// doRead()方法是读取Excel文件
EasyExcel.read(fileName, abc.class, new abclistener()).sheet().doRead();
}
}
以下为读取结果:
写入Excel文档
根据你要写入的结构创建实体类
package com.example.station.model.Excel;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import lombok.Data;
import java.util.Date;
@Data
public class abc {
// 表头 通过注解 @ExcelProperty(value = "字符串") 来指定这一列的表头名称
@ExcelProperty(value = "字符串")
public String str;
@ExcelProperty(value = "日期")
public String date;
@ExcelProperty(value = "数值")
public int num;
}
package com.example.station.util;
import com.alibaba.excel.EasyExcel;
import com.example.station.model.Excel.abc;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.ListUtils;
import java.util.*;
@Slf4j
public class ExcelUtil {
public static void main(String[] args) {
String fileName = "C:\\Users\\Administrator\\Desktop\\abc.xlsx";
// 读取Excel文件
// 这里的abc.class是你要读取的实体类
// new abclistener()是读取监听器
// 这里的sheet()方法是指定读取的sheet页,默认是第1个
// doRead()方法是读取Excel文件
EasyExcel.read(fileName, abc.class, new abclistener()).sheet().doRead();
log.error("读取完成 开始写入");
// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
// 这里data()是要写入的数据
EasyExcel.write(fileName, abc.class).sheet("Sheet1").doWrite(data());
log.error("写入完成 开始读取");
EasyExcel.read(fileName, abc.class, new abclistener()).sheet().doRead();
}
// 生成要插入的Excel数据
private static List<abc> data() {
List<abc> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
abc data = new abc();
data.setStr("字符串" + i);
data.setDate(new Date().toString());
data.setNum(i+12);
list.add(data);
}
return list;
}
}
可以看到数据写入成功 !