携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情
1.EasyExcel是什么
EasyExcel是阿里巴巴开源的一个excel处理框架,是一个Java开源项目,可以简单,省内存的读写Excel。
优点如下:
- 简单,省内存
- 不会将数据一次性读入内存,而是逐行加载解析。这也是EasyExcel节省内存的原因。
缺点:
- 不擅长对数据进行增删改,适合来查询(我们一般情况下是对Excel表格来进行查询操作,所以EasyExcel还是很好的)
在这里顺便向同学们介绍下其他可以对Excel进行解析和生成的框架,比较出名的有Apache poi、jxl等,当然了他们的缺点就是耗内存,因为他们是将数据全部加载到内存里面。如果你是要对数据进行增删改,那么将数据全部加载到内存里面那就不是一个缺点了,因为这有利于增删改操作。
2.Excel术语介绍
- 整个Excel表格称为workbook
- workbook里边有很多sheet。大家还记得Excel表格左下角吗?那里可以建很多sheet,如下图所示:
- 在每个sheet里面有行,列,单元格
3.EasyExcel写操作
实现步骤:
- 引入相关依赖
- 创建实体类,这个类和Excel的列名对应。设置Excel表头(一般情况,第一行就是表头)
- 调用EasyExcel方法实现写操作
引入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.1</version>
</dependency>
创建实体类(@ExcelProperty里面的value的值会成为Excel表头的值)
@Data
public class User {
@ExcelProperty(value = "用户编号")//设置表头信息
private int id;
@ExcelProperty(value = "用户名称")
private String name;
}
进行写操作
public class TestWrite {
public static void main(String[] args) {
//设置文件名称和路径
String fileName = "D:\atguigu.xlsx";
//调用方法
EasyExcel.write(fileName,User.class)//相当于创建了一个workbook
.sheet("写操作")//建一个sheet,设置sheet的名字
.doWrite(data());//往行列单元格写内容,这个方法的参数是list集合
}
//循环设置要添加的数据,最终封装到list集合中
private static List<User> data() {
List<User> list = new ArrayList<User>();
for (int i = 0; i < 10; i++) {
User data = new User();
data.setId(i);
data.setName("张三"+i);
list.add(data);
}
return list;
}
}
实验结果
4.EasyExcel读操作
实现步骤:
- 引入依赖
- 创建和Excel表格对应的实体类,设置对应关系(用注解和属性)
- 创建监听器进行一行一行解析过程。这个监听器不用我们创建,我们只需要创建一个类,又这个类去继承EasyExcel的监听器类,然后重写方法即可。
- 调用EasyExcel读方法实现读操作
引入的依赖和写操作的一样。
实体类需要做一些改变,具体的就是设置实体类的属性对应表格的哪一列,index=0代表第一列,index=1代表第二列
@Data
public class User {
@ExcelProperty(value = "用户编号",index = 0)//设置表头信息
private int id;
@ExcelProperty(value = "用户名称",index = 1)
private String name;
}
监听器(监听器继承的类的泛型对象是和Excel表格对应的实体类)
public class ExceListener extends AnalysisEventListener<User> {
//一行一行读取Excel的内容,然后将每行内容封装到user对象
//从Excel第二行开始读取(第一行是表头)
@Override
public void invoke(User user, AnalysisContext analysisContext) {
System.out.println(user);
}
//读取表头内容,这个方法可以到AnalysisEventListener里面复制出来,然后加个@Override注解
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
System.out.println("表头:"+headMap);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
}
实现读取操作
public class TestRead {
public static void main(String[] args) {
//设置文件名称和路径
String fileName = "D:\atguigu.xlsx";
//调用方法进行读操作
EasyExcel.read(fileName,User.class,new ExceListener()).sheet().doRead();
}
}
实验结果:
注意:一张表里面是可能有多个sheet的,在读操作的表里,有个sheet方法是可以接收一个参数的,这个参数可以说sheet名。比如
EasyExcel的实际应用可看此文章