Excel映射到实体-easyexcel工具

来源

项目需要把Excel进行解析,并映射到对象属性,实现类似Mybatis的ORM的效果。使用的方式是自定义注解+POI,这种方式代码复杂而且不易于维护。
easyexcel是阿里巴巴开源的一个框架,解决了字段映射问题、OOM问题、使用复杂问题等,总之是一个很方便的工具
GitHub链接

使用

添加依赖

<!--添加maven依赖-->
<!--easyexcel-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>2.1.3</version>
</dependency>
<!--fastjson-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.62</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.10</version>
    <scope>provided</scope>
</dependency>

准备excel

准备实体

@Data
public class Student {
    /**
     * 也可以使用@ExcelProperty(index = 2) 指定列数 
     * 官方不建议 index 和 name 同时用,要么一个对象只用index,要么一个对象只用name去匹配
     */
    @ExcelProperty("姓名")
    private String name;
    @ExcelProperty("学号")
    private String stuId;
    @ExcelProperty("班级")
    private String classId;
}

创建监听器

public class DemoDataListener extends AnalysisEventListener<Student> {
    private List<Student> list = new LinkedList<Student>();

    /**
     * 这个每一条数据解析都会来调用
     * @param student
     * @param analysisContext
     */
    public void invoke(Student student, AnalysisContext analysisContext) {
        System.out.println("读取到一条数据 " + JSON.toJSONString(student));
        list.add(student);
    }

    /**
     * 所有数据读取完了调用
     * @param analysisContext
     */
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        System.out.println("读取完毕 所有数据  " + JSON.toJSONString(list));
    }
}

读取

public class Main {
    public static void main(String[] args) {
        String fileName = "D:\1.xlsx";
        ExcelReader excelReader = EasyExcel.read(fileName, Student.class, new DemoDataListener()).build();
        ReadSheet readSheet = EasyExcel.readSheet(0).build();
        excelReader.read(readSheet);
        // 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
        excelReader.finish();
    }
}

结果

其他问题

如果第一行不是表头,而是像以下数据怎么办呢

很简单只需要设置readSheetheadRowNumber即可

public class Main {
    public static void main(String[] args) {
        String fileName = "D:\1.xlsx";
        ExcelReader excelReader = EasyExcel.read(fileName, Student.class, new DemoDataListener()).build();
        ReadSheet readSheet = EasyExcel.readSheet(0).headRowNumber(2).build();
        excelReader.read(readSheet);
        // 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
        excelReader.finish();
    }
}

其他复杂表格请参考
官网文档

原文地址:https://www.cnblogs.com/ingxx/p/11934628.html