当前位置: 首页 > article >正文

7.Easyexcel的使用

七.Easyexcel的使用

1.为什么程序中需要使用excel

2.技术选型

3.具体使用

七.Easyexcel的使用

1.为什么程序中需要使用excel

  • 企业用excel表格导入批量数据
  • 保存日志出勤记录等不变数据
  • 异构系统间数据传输
    PHP系统无法访问数据库,开发JAVA系统来增加功能,需要数据,则PHP导出excel数据,然后JAVA系统导入数据库

2.技术选型

  • POI技术
    过于耗内存,一次性读完所有数据,容易发生OOM或者JVM频繁full gc
  • easy excel
    一行一行读取数据,节省内存,观察者模式处理

3.具体使用

①流程

  • 定义实体类(可用@ExcelProperty声明列名)
  • 直接写出excel(xls旧版,xlsx新版,新版节省空间,但是仍然有很多旧版需要兼容旧版)
  • 写入excel(需要监听器来获取每一条数据和完成读取)

②引入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.like</groupId>
    <artifactId>alibaba-execel</artifactId>
    <version>1.0-SNAPSHOT</version>


    <dependencies>

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

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.5</version>
        </dependency>

        <dependency>
            <groupId>org.apache.xmlbeans</groupId>
            <artifactId>xmlbeans</artifactId>
            <version>3.1.0</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

    </dependencies>
</project>

③创建实体类

package com.atguigu.easyexecel.dto;

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;

import java.util.Date;


@Data
public class ExcelStudentDTO {

    @ExcelProperty("姓名")
    private String name;

    @ExcelProperty("生日")
    private Date birthday;

    @ExcelProperty("薪资")
    private Double salary;
}

④创建监听器

package com.atguigu.easyexecel.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.atguigu.easyexecel.dto.ExcelStudentDTO;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class ExcelStudentDTOListener extends AnalysisEventListener<ExcelStudentDTO> {

    /**
     * 这个每一条数据解析都会来调用
     */
    @Override
    public void invoke(ExcelStudentDTO data, AnalysisContext context) {
        log.info("解析到一条数据:{}", data);

        //调用mapper中的save方法即可保存

    }

    /**
     * 所有数据解析完成了 都会来调用
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        log.info("所有数据解析完成!");
    }
}

⑤读excel和写excel

  • 读excel
package com.atguigu.easyexecel;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.atguigu.easyexecel.dto.ExcelStudentDTO;
import com.atguigu.easyexecel.listener.ExcelStudentDTOListener;
import org.junit.Test;

public class ExcelReadTest {

    /**
     * 最简单的读
     */
    @Test
    public void simpleReadXlsx() {

        String fileName = "d:/excel/simpleWrite.xlsx";
        // 这里默认读取第一个sheet,默认版本xlsx
        EasyExcel.read(fileName, ExcelStudentDTO.class, new ExcelStudentDTOListener()).sheet().doRead();
    }

    @Test
    public void simpleReadXls() {

        String fileName = "d:/excel/simpleWrite.xls";
        EasyExcel.read(fileName, ExcelStudentDTO.class, new ExcelStudentDTOListener()).excelType(ExcelTypeEnum.XLS).sheet().doRead();
    }
}
  • 写excel
package com.atguigu.easyexecel;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.atguigu.easyexecel.dto.ExcelStudentDTO;
import org.junit.Test;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class ExecelWriteTest {

    @Test
    public void simpleWriteXlsx() {
        //xlsx 是xls的升级并且省空间,xls
        String fileName = "d:/excel/simpleWrite.xlsx"; //需要提前新建目录
        // 这里 需要指定写用哪个class去写,然后写到第一个(execel的表)sheet,名字为模板 然后文件流会自动关闭  List列表
        EasyExcel.write(fileName, ExcelStudentDTO.class).sheet("模板").doWrite(data());
    }

    //兼容就得xls的版本
    @Test
    public void simpleWriteXls() {
        //xlsx 是xls的升级并且省空间,xls
        String fileName = "d:/excel/simpleWrite.xls"; //需要提前新建目录
        // 这里 需要指定写用哪个class去写,然后写到第一个(execel的表)sheet,名字为模板 然后文件流会自动关闭  List列表
        //需要传入
        EasyExcel.write(fileName, ExcelStudentDTO.class).excelType(ExcelTypeEnum.XLS).sheet("模板").doWrite(data());
    }

    //模拟数据库查询出的数据
    //辅助方法
    private List<ExcelStudentDTO> data(){
        List<ExcelStudentDTO> list = new ArrayList<>();

        //算上标题,做多可写65536行,(xls的要求,)
        //算上标题,做多可写1048576行,(xlsx的要求)
        //超出:java.lang.IllegalArgumentException: Invalid row number (65536) outside allowable range (0..65535)
        for (int i = 0; i < 65535; i++) {
            ExcelStudentDTO data = new ExcelStudentDTO();
            data.setName("Helen" + i);
            data.setBirthday(new Date());
            data.setSalary(123456.1234);
            list.add(data);
        }

        return list;
    }
}


未更新

未更新

未更新

未更新

未更新

未更新

未更新

未更新

未更新

未更新

未更新


http://www.kler.cn/a/9998.html

相关文章:

  • 深入了解Git、GitHub、GitLab及其应用技巧
  • SpringBoot(十)SpringBoot使用QQ邮箱stmp发送邮件
  • 微信小程序_模板与配置_day2
  • 力扣每日一题 3258. 统计满足 K 约束的子字符串数量 I
  • 分布式----Ceph部署
  • 前端web
  • Mac下Python3安装及基于Idea开发
  • 如何面对人生困境至暗时刻
  • 2023年数据挖掘与知识发现国际会议(DMKD 2023) | IOP JPCS独立出版
  • Python 小型项目大全 21~25
  • 一篇搞定Lambda和Stream流
  • 最新CAMx-Python融合技术应用与大气污染来源解析方法应用
  • MongoDB 介绍和基本操作
  • 【设计模式】常用的几种设计模式——单例模式
  • RuoYi-Vue Pro框架学习启动教程
  • 【数据结构】排序习题
  • Vue学习-Vue入门
  • 【MySQL学习】认识MySQL数据库
  • ObjectBox一种基于中心点的无锚点目标检测方法
  • 「UG/NX」Block UI 快速定位ORentXpress
  • 4.10日报
  • 10个镜像网站工具箱供你使用,不注册ChatGPT也能免费使用ChatGPT
  • 2023美团春招4.8 后端真题和解析 第三题:水果打包
  • Servlet入门讲解
  • Python 小型项目大全 26~30
  • 一位27岁软件测试员,测试在职近5年,月薪不到2W,担心被应届生取代