首先理解核心概念
工作簿:一个excel文件就是一个工作簿
工作表:一个工作簿中可以有多个工作表(sheet)
<!-- easyExcel -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.1</version>
</dependency>
/**
* 学生实体类
*/
@Data
public class Student {
/**
* 主键id
*/
private String id;
/**
* 学生姓名
*/
private String name;
/**
* 性别
*/
private String gender;
/**
* 出生日期
*/
private Date birthday;
}
创建一个测试导入.xls文件,并将其放在项目的根目录下
?编写一个读取Excel数据的测试类
/**
* 读Excel内容
*/
@Test
public void test01() {
// 获取一个工作簿
ExcelReaderBuilder readWork = EasyExcel.read("测试导入.xls", Student.class, new StudentListener());
// 获得一个工作表对象
ExcelReaderSheetBuilder sheet = readWork.sheet();
// 读取工作表中的内容
sheet.doRead();
}
?编写对应读取文件的监听器类
/**
* 读取文档的监听器
*/
public class StudentListener extends AnalysisEventListener<Student> {
/**
* 每读取一行内容,都会调用一次invoke,在invoke可以操作使用读取到的数据
* @param o 读取的内容数据
* @param analysisContext 不知道是啥,应该是上下文之类的东西
*/
public void invoke(Student o, AnalysisContext analysisContext) {
System.out.println(o);
}
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
}
在实际的工作中,可以在invoke里面编写对应的数据入库业务。
运行读取数据测试类
可以看到导入数据每一列的excel和实体类定义的顺序是一一对应的,如果顺序错了,导入对应的字段就是错误的。
为了解决这个问题,可以定义一个专门用来写入与写出数据的实体类,然后在这个实体类中使用相应的注解,更好更方便的进行数据的导入导出。
如我现在定义一个 StudentEasyExcelModel.class
@Data
@HeadRowHeight(30) // 定义Excel的表头行高
@ContentRowHeight(20) // 定义Excel的内容行高
public class StudentEasyExcelModel {
/**
* * 学生姓名
*/
@ExcelProperty(value = "学生姓名", index = 0) // 对应excel列名与导出顺序
@ColumnWidth(20) // 定义列宽
private String name;
/**
* 性别
*/
@ExcelProperty(value = "学生性别", index = 1)
@ColumnWidth(10)
private String gender;
/**
* 出生日期
*/
@ExcelProperty(value = "学生出生日期", index = 2)
@ColumnWidth(20)
private Date birthday;
}
修改监听器
/**
* 读取文档的监听器
*/
public class StudentListener extends AnalysisEventListener<StudentEasyExcelModel> {
/**
* 每读取一行内容,都会调用一次invoke,在invoke可以操作使用读取到的数据
* @param o 读取的内容数据
* @param analysisContext 不知道是啥,应该是上下文之类的东西
*/
public void invoke(StudentEasyExcelModel o, AnalysisContext analysisContext) {
System.out.println(o);
}
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
}
修改测试类
? /**
* 读Excel内容
*/
@Test
public void test01() {
// 获取一个工作簿
ExcelReaderBuilder readWork = EasyExcel.read("测试导入.xls", StudentEasyExcelModel.class, new StudentListener());
// 获得一个工作表对象
ExcelReaderSheetBuilder sheet = readWork.sheet();
// 读取工作表中的内容
sheet.doRead();
} ?
运行测试
编写测试代码
/**
* 写Excel内容
*/
@Test
public void test02() {
// 获取一个工作簿对象
ExcelWriterBuilder writeWork = EasyExcel.write("测试导出.xls", StudentEasyExcelModel.class); // 获得一个工作表对象
ExcelWriterSheetBuilder sheet = writeWork.sheet();
// 准备写入的数据
List<StudentEasyExcelModel> students = initData();
// 往excel中写入数据
sheet.doWrite(students);
}
/**
* 模拟学生导出信息
* @return 信息list
*/
private static List<StudentEasyExcelModel> initData() {
ArrayList<StudentEasyExcelModel> students = new ArrayList<StudentEasyExcelModel>();
for (int i = 0; i < 10; i++) {
StudentEasyExcelModel student = new StudentEasyExcelModel();
student.setName("学生导出姓名" + i);
student.setGender("女");
student.setBirthday(new Date());
students.add(student);
}
return students;
}
运行测试