最近做项目的时候遇到需要读取excel,同时需要把整个excel的正确数据和错误数据标记出来。所以这里我们直接使用EasyExcel框架来实现。
这里主要的核心是使用EasyExcel的listener来进行操作即可。不多说,直接案例。
一、准备excel
| id | name | age | class |
| 1 | 张三 | 三 | 一年级 |
| 2 | 李四 | 13 | 二年级 |
| 3 | 王五 | 14 | 三年级 |
二、创建一个maven项目,并且引入maven依赖
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.14.8</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.1.3</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.83</version> </dependency>
三、创建student的model类
package com.demo.Demo.model;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.experimental.Builder;
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
@ToString
@Builder
public class StudentPoJo implements Serializable {
private static final long serialVersionUID = -3756473643946418018L;
private Integer id;
private String name;
private Integer age;
private String clazz;
}备注:我们这里使用的integer解析age字段,excel里面第二行会出问题。所以这就是我们要标记的错误数据。
四、编写studentListener类
package com.demo.Demo.listener;
import java.util.List;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.demo.Demo.model.StudentPoJo;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class StudentListener implements ReadListener<StudentPoJo> {
// 记录正确的结果
private List<StudentPoJo> students;
// 记录错误的行
private List<Integer> errorList; // 这里由于解析错误的话,整行数据都不会存在,因此我们可以记录下对应的行号。
public StudentListener(List<Integer> errorList, List<StudentPoJo> students) {
this.students = students;
this.errorList = errorList;
}
@Override
public void invoke(StudentPoJo student, AnalysisContext context) {
// 解析的时候如果解析成功会执行这里的方法,当前解析
students.add(student);
}
@Override
public void onException(Exception exception, AnalysisContext context) throws Exception {
// 如果解析失败的话,则进入到这里的方法。
errorList.add(context.readRowHolder().getRowIndex() + 1);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
}
}五、编写主类,读取excel
package com.demo.Demo;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.excel.EasyExcel;
import com.alibaba.fastjson.JSON;
import com.demo.Demo.listener.StudentListener;
import com.demo.Demo.model.StudentPoJo;
public class ExcelReaderJob {
public static void main(String[] args) throws Exception {
String filePath = "C:\\Users\\Administrator\\Desktop\\fsdownload\\students.xlsx";
// 记录正确返回的model
List<StudentPoJo> rs = new ArrayList<StudentPoJo>();
// 记录返回的错误数据行
List<Integer> errorList = new ArrayList<Integer>();
EasyExcel.read(filePath, StudentPoJo.class, new StudentListener(errorList, rs)).sheet().doRead();
System.out.println("解析成功的数据:" + JSON.toJSONString(rs));
System.out.println("解析失败的数据:" + JSON.toJSONString(errorList));
}
}然后我们执行一下,看下结果:
这里我们就实现了读取excel,并且标记出正确和错误的数据。(具体的逻辑参见代码的注释部分).
通过以上的功能,我们可以实现:
1、获取解析正确的数据行数 2、获取解析错误的数据行数 3、获取解析正确的数据结果,可以插入数据库。
备注:
1、这里如果我们想要把错误的数据返回回来,并且写入新的excel的话,可以在exception里面把cell的数据提取出来,在listener里面的onexception方法可以获取cell相关的值,例如:
Map<Integer, Cell> cellMap = context.readRowHolder().getCellMap();
System.out.println("错误行:"+JSON.toJSONString(cellMap));;最后附上本案例的源码,同时再详细介绍下把错误数据提取出来,方便把错误数据写入数据库或者重新写成excel文件,大家登录即可看到。










还没有评论,来说两句吧...