开箱即用之使用EasyExcel操作Excel导入导出

发布时间:2023年12月26日

首先理解核心概念

工作簿:一个excel文件就是一个工作簿

工作表:一个工作簿中可以有多个工作表(sheet)

一、引入pom文件

<!-- 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;    
}

三、Excel数据导入

创建一个测试导入.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导出

编写测试代码

/**      
* 写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;     
}

运行测试

文章来源:https://blog.csdn.net/2301_76354366/article/details/132389723
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。