EasyExcel操作
官方文档:添加链接描述
一、导入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.7</version>
</dependency>
二、创建实体类
@Data
public class DemoData {
@ExcelProperty("字符串标题")
private String string;
@ExcelProperty("日期标题")
private Date date;
@ExcelProperty("数字标题")
private Double doubleData;
/*忽略这个字段 它就不会生成这个字段的表格*/
@ExcelIgnore
private String ignore;
}
三、写入操作
package com.yangzihao.springbooteasyexcel;
import com.alibaba.excel.EasyExcel;
import com.yangzihao.springbooteasyexcel.easy.DemoData;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/*测试类*/
@SpringBootTest
public class EasyTest {
public static String PATH="E:\\mavenworkspace\\springboot-easyexcel\\src\\main\\resources\\"; //当前项目资源文件路径
/*通过这个方法生成数据*/
private List<DemoData> data() {
List<DemoData> list = new ArrayList<DemoData>();
for (int i = 0; i < 10; i++) {
DemoData data = new DemoData();
data.setString("字符串" + i);
data.setDate(new Date());
data.setDoubleData(0.56);
list.add(data);
}
return list;
}
/*将数据写进excel*/
@Test
public void test(){
//文件名
String fileName = PATH + "EasyTest.xlsx";
//第一个参数为文件路径和文件名 第二个为根据哪个类的规则去写进 第三个参数为写出的list集合数据
//write(文件名,实体类) sheet("表格名") doWrite(写进表格的数据(来自数据库查询的数据或者是前端传递过来也行))
EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data());
}
}
四、数据读取操作
1、用来进行持久化操作的DAO
package com.yangzihao.springbooteasyexcel;
import com.yangzihao.springbooteasyexcel.easy.DemoData;
import java.util.List;
public class DemoDAO {
public void save(List<DemoData> list) {
// 如果是mybatis,尽量别直接调用多次insert,自己写一个mapper里面新增一个方法batchInsert,所有数据一次性插入
/*进行持久化操作*/
}
}
2、数据写入的逻辑的监听器
package com.yangzihao.springbooteasyexcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import com.yangzihao.springbooteasyexcel.easy.DemoData;
import lombok.extern.slf4j.Slf4j;
import org.junit.platform.commons.logging.Logger;
import org.junit.platform.commons.logging.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
@Slf4j
public class DemoDataListener extends AnalysisEventListener<DemoData> {
private static final int BATCH_COUNT = 5;
List<DemoData> list = new ArrayList<DemoData>(); //存储读取到的数据
private DemoDAO demoDAO;
public DemoDataListener() {
demoDAO = new DemoDAO();
}
public DemoDataListener(DemoDAO demoDAO) {
this.demoDAO = demoDAO;
}
/*读取数据的时候会执行这个invoke方法*/
//DemoData 类型
//AnalysisContext 分词器
@Override
public void invoke(DemoData data, AnalysisContext context) {
log.info("解析到一条数据:{}", JSON.toJSONString(data));
list.add(data);
// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
if (list.size() >= BATCH_COUNT) {
saveData();
// 存储完成清理 list
list.clear();
}
}
/*所有数据执行完后会执行这个方法*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 这里也要保存数据,确保最后遗留的数据也存储到数据库
saveData();
log.info("所有数据解析完成!");
}
/*调用持久化方法*/
private void saveData() {
log.info("{}条数据,开始存储数据库!", list.size());
demoDAO.save(list);
log.info("存储数据库成功!");
}
}
3、读取方法的调用
//读取操作
@Test
public void read(){
//文件名
String fileName = PATH + "EasyTest.xlsx";
//这里指定用哪个class去读,然后读取第一个sheet 文件流会自动关闭
//读取的逻辑都在DemoDataListener 监听器的invoke方法中
EasyExcel.read(fileName,DemoData.class,new DemoDataListener()).sheet().doRead();
}
就是这么简单、完结撒花、、、