EasyExcel简单读写Excel操作

EasyExcel简单读取写入Excel文件

​ EasyExcel 是来自alibaba的一个优秀的读写Excel工具。相比同一作用的POI,EasyExcel的性能以及稳定性更加优秀,并且EasyExcel正常情况下不会出现内存溢出的情况。

github:

https://github.com/alibaba/easyexcel

官网:

https://www.yuque.com/easyexcel/doc/easyexcel

MyGithub Demo: (欢迎点star)

https://github.com/wingshu/ReadWriteExcel/tree/master

构建一个简单的EasyExcel Demo

引入EasyExcel相关依赖

构建对应实体类

构建EasyExcel “读” 流程

构建EasyExcel“写”流程

引入POM相关依赖 (其他依赖参考MyGithub ReadWriteExcel Demo的POM文件)

<dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>easyexcel</artifactId>
      <version>2.2.6</version>
</dependency>

构建对应实体类

​ 这里就以一个Student 实体类 为例

@Data //lombok插件 作用 自动构建getter,setter
public class Student {
    @ExcelProperty("学号")
    @ColumnWidth(6)             //列宽
    private int studentId;
    @ExcelProperty("姓名")
    @ColumnWidth(8)
    private String studentName;
    @ExcelProperty("电话")
    @ColumnWidth(8)
    private String phone;
}

读取Excel数据:(将Excel文件中已按照Student实体类设置的字段规则,进行读取数据,返回值为List。)

读操作的监听器

public class StudentListenr extends AnalysisEventListener<Student> {
    private static final Logger LOGGER = LoggerFactory.getLogger(StudentListenr.class);
    /**
     * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
     */
    private static final int BATCH_COUNT = 5;
    List<Student> list = new ArrayList<Student>();

    private Student demoDAO;
    public StudentListenr() {
        // 这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数
        demoDAO = new Student();
    }

    public StudentListenr(Student demoDAO) {
        this.demoDAO = demoDAO;
    }

    @Override
    public void invoke(Student student, AnalysisContext analysisContext) {
        System.out.println("解析到一条数据:"+JSON.toJSONString(student));
        list.add(student);
        // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
        if (list.size() >= BATCH_COUNT) {
            saveData();
            // 存储完成清理 list
            list.clear();
        }
    }
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        //数据存储
        saveData();
        System.out.println(("所有数据解析完成!"));
    }

    /**
     * 加上存储数据库
     */
    private void saveData() {
        System.out.println(list.size()+"条数据,可进行数据库存储!");;
        System.out.println((Arrays.toString(new List[]{list})));
        System.out.println("数据处理完毕");
    }
}

​ Excel数据存储方式 Map 或者 实体类

/*
        读取Excel文档数据
*/
    @Test
    void contextLoads() {
//        ExcelReaderBuilder read = EasyExcel.read("D://xsmEasyExcelTest.xlsx", Student.class, new StudentListenr());
//        ExcelReaderSheetBuilder sheet = read.sheet();
//        sheet.doRead();

        //一行搞定版,其他详细的读取文档操作可参考官网读Excel相关文档
        EasyExcel.read("D://xushuminEasyExcelTest.xlsx", Student.class, new StudentListenr()).sheet().doRead();
    }

写操作Excel: (将Student实体类数据通过Excel保存起来)

/*
        写操作Excel文档
     */
    @Test
    public void writeExcel(){
        Student student = new Student();
        student.setStudentId(3);
        student.setStudentName("xushumin");
        student.setPhone("123");
        List<Student> list = new ArrayList<Student>();
        list.add(student);
        ExcelWriterBuilder write = EasyExcel.write("D://xsmEasyExcelTest.xlsx", Student.class);
        write.sheet().doWrite(list);
    }

总结

​ 以上有任何不明白的地方均可在下方评论区评论,欢迎大家前来评论。EasyExcel是目前较为流行的针对Excel的解析工具,可用于实现Excel的导入导出任务,在后续的文章中将详细讲解关于Excel导入导出前后端的实现逻辑

小知识点积累:

Integer和int的区别?在什么时候用Integer和什么时候用int

例子

区别:Integer 默认值为null,int 默认值为 0 。 在遇到像考试成绩表达的时候,null 表示学生未参加考试,0表示学生成绩为0 ,所以在此场景时 使用Integer更加适合。同理EL表达式 也使用Integer。

相应的Integer的缺点在于,在进行加减乘除时 ,需要拆箱装箱耗费性能。

xushumin:让复杂的事情简单做,简单的事情快速做。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值