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(需要监听器来获取每一条数据和完成读取)

②引入依赖


<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.0modelVersion>

    <groupId>com.likegroupId>
    <artifactId>alibaba-execelartifactId>
    <version>1.0-SNAPSHOTversion>


    <dependencies>

        <dependency>
            <groupId>com.alibabagroupId>
            <artifactId>easyexcelartifactId>
            <version>2.1.7version>
        dependency>

        <dependency>
            <groupId>org.slf4jgroupId>
            <artifactId>slf4j-simpleartifactId>
            <version>1.7.5version>
        dependency>

        <dependency>
            <groupId>org.apache.xmlbeansgroupId>
            <artifactId>xmlbeansartifactId>
            <version>3.1.0version>
        dependency>

        <dependency>
            <groupId>org.projectlombokgroupId>
            <artifactId>lombokartifactId>
            <version>1.18.12version>
        dependency>

        <dependency>
            <groupId>junitgroupId>
            <artifactId>junitartifactId>
            <version>4.12version>
        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;
    }
}


未更新

未更新

未更新

未更新

未更新

未更新

未更新

未更新

未更新

未更新

未更新

你可能感兴趣的:(项目1:金融借钱还钱,java,excel,开发语言)