开发环境:
SpringBoot2.7.6, JDK:8, EasyExcel:3.3.2
目标
读取得到Excel的所有内容
pom
!!注意这个地方EasyExcel需要去掉poi,自己引入
<!-- easyexcel -->
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<exclusions>
<exclusion>
<artifactId>poi-ooxml-schemas</artifactId>
<groupId>org.apache.poi</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.2</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<!-- hutool -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.23</version>
</dependency>
</dependency>
实现方案1-无须指定sheet页
第一步-建立实体类
建一个实体类,将Excel中的内容映射到实体类
在EasyExcel提供的@ExcelProperty注解中将 value的属性值设置为对应的表头名称即可。
@Data
@AllArgsConstructor
@NoArgsConstructor
public class FirstDemo {
@ExcelProperty(value = "人名")
private String fullName;
@ExcelProperty(value = "性别")
private String sex;
@ExcelProperty(value = "出生日期")
private Date birthDay;
@ExcelProperty(value = "工资")
private Long salary;
}
也可以通过index属性来进行标识
@ExcelProperty(index = 2)
private Date birthDay;
第二步-编写读取代码
这种方式无法设置具体的sheet页,他会读取整个excel
代码如下:
public static void main(String[] args) {
String excelPath = "excel路径";
List<FirstDemo> firstDemos = EasyExcel
.read(excelPath)
.head(FirstDemo.class)
.doReadAllSync();
System.out.println(JSONUtil.toJsonPrettyStr(firstDemos));
}
调用read方法,传入excel路径,
调用head方法,传入设置的实体类,
调用doReadAllSync读取文件。
结果如下:
ps:这个birthday是正确的,只是说打印成了时间戳的格式。
实现方案2-指定sheet页
如果像上一步的代码是无法指定sheet页的,会遍历所有的sheet页,我在上一份的excel中多加了一个sheet页,用上面的代码就会读取两个sheet页。
用上面的代码跑出的结果:
第一步-建立实体类
和方案1一致
@Data
@AllArgsConstructor
@NoArgsConstructor
public class FirstDemo {
@ExcelProperty(value = "人名")
private String fullName;
@ExcelProperty(value = "性别")
private String sex;
@ExcelProperty(value = "出生日期")
private Date birthDay;
@ExcelProperty(value = "工资")
private Long salary;
}
第二步-编写监听器
在这里需要定义EasyExcel的读取监听器。
public class FirstDemoListener extends AnalysisEventListener<FirstDemo> {
private final List<FirstDemo> dataList = new ArrayList<FirstDemo>();
public void invoke(FirstDemo data, AnalysisContext context) {
dataList.add(data);
}
public void doAfterAllAnalysed(AnalysisContext context) {
System.out.println("read finish");
}
public List<FirstDemo> getDataList() {
return dataList;
}
}
首先继承AnalysisEventListener,
现在我们需要实现的功能只需要重写这两个方法即可, invoke(), doAfterAllAnalysed(),
然后定义一个存储读取结果的List,
在invoke中将结果添加到list中,
最后设置一个这个list的get方法就齐活了。
第三步-编写读取代码
public static void main(String[] args) {
String excelPath = "excel路径";
FirstDemoListener firstDemoListener = new FirstDemoListener();
EasyExcel.read(excelPath)
.sheet(1)
.headRowNumber(1)
.head(FirstDemo.class)
.registerReadListener(firstDemoListener)
.doRead();
List<FirstDemo> dataList = firstDemoListener.getDataList();
System.out.println(JSONUtil.toJsonPrettyStr(dataList));
}
在这里设置需要读取的sheet页【名称或第几个sheet页均可】,
设置第一行数据的index,
设置实体类信息,
注册监听器
之后通过之前在监听器中设置的list的get方法,即可获得数据。