最近做项目的时候遇到需要读取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文件,大家登录即可看到。
还没有评论,来说两句吧...