Alibaba Easy Excel

https://www.yuque.com/easyexcel/doc/read#5c70a7ac

读取

<dependencies>
<!--      Alibaba Easy Excel  -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.1.6</version>
        </dependency>
<!--      lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
        </dependency>
<!--        fastjson-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.75</version>
        </dependency>
    </dependencies>

student.xlsx 被读取的文件

姓名 年龄 地址 余额
张三 22 广东省深圳市 6543
李四 18 湖北省武汉市 4900
王五 36 云南省昆明市 5200

Student 实体类

import lombok.Data;

@Data
public class Student {
    private String stu_name;
    private Integer age;
    private String address;
    private Float money;
}

测试代码

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;


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

public class Test {
    public static void main(String[] args) {

        //存储读取出来的数据
        List<Student> studentList = new ArrayList<>();
        //获取文件路径
        String filename = "src/main/resources/student.xlsx";
        // 这里需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
        // excel中表的列要与对象的字段相对应
        EasyExcel.read(filename, Student.class, new AnalysisEventListener<Student>() {

            // 每解析一条数据都会调用该方法
            @Override
            public void invoke(Student student, AnalysisContext analysisContext) {
                System.out.println("解析一条Student对象:" + JSON.toJSONString(student));
                studentList.add(student);
            }

            // 解析完毕的回调方法
            @Override
            public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                System.out.println("excel文件读取完毕!");
            }
        }).sheet().doRead();

        System.out.println(studentList);
    }
}

控制台输出

解析一条Student对象:{"address":"广东省深圳市","age":22,"money":6543.0,"stu_name":"张三"}
解析一条Student对象:{"address":"湖北省武汉市","age":18,"money":4900.0,"stu_name":"李四"}
解析一条Student对象:{"address":"云南省昆明市","age":36,"money":5200.0,"stu_name":"王五"}
excel文件读取完毕!
[Student(stu_name=张三, age=22, address=广东省深圳市, money=6543.0), Student(stu_name=李四, age=18, address=湖北省武汉市, money=4900.0), Student(stu_name=王五, age=36, address=云南省昆明市, money=5200.0)]

指定列的下标或者列名

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

@Data
public class Student {
    @ExcelProperty("姓名")
    private String stu_name;
    private Integer age;
    @ExcelProperty("地址")
    private String address;
    private Float money;
}

读多个sheet

excel sheel1

姓名 年龄 地址 余额
张三 22 广东省深圳市 6543
李四 18 湖北省武汉市 4900
王五 36 云南省昆明市 5200

excel sheel2

姓名 年龄 地址 余额
张三 22 广东省深圳市 6543
李四 18 湖北省武汉市 4900
王五 36 云南省昆明市 5200
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;


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

public class Test {
    public static void main(String[] args) {

        //存储读取出来的数据
        List<Student> studentList = new ArrayList<>();
        //获取文件路径
        String filename = "src/main/resources/student.xlsx";
        // 这里需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
        // excel中表的列要与对象的字段相对应
        EasyExcel.read(filename, Student.class, new AnalysisEventListener<Student>() {

            // 每解析一条数据都会调用该方法
            @Override
            public void invoke(Student student, AnalysisContext analysisContext) {
                System.out.println("解析一条Student对象:" + JSON.toJSONString(student));
                studentList.add(student);
            }

            // 解析完毕的回调方法
            @Override
            public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                System.out.println("excel文件读取完毕!");
            }
            //这里调用的方法不一样
        }).doReadAll();

        System.out.println(studentList);
    }
}

日期、数字或者自定义格式转换

本人未测试

@Data
public class ConverterData {
    /**
     * 我自定义 转换器,不管数据库传过来什么 。我给他加上“自定义:”
     */
    @ExcelProperty(converter = CustomStringStringConverter.class)
    private String string;
    /**
     * 这里用string 去接日期才能格式化。我想接收年月日格式
     */
    @DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒")
    private String date;
    /**
     * 我想接收百分比的数字
     */
    @NumberFormat("#.##%")
    private String doubleData;
}

读取表头数据

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;


import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class Test {
    public static void main(String[] args) {

        //存储读取出来的数据
        List<Student> studentList = new ArrayList<>();
        //获取文件路径
        String filename = "src/main/resources/student.xlsx";
        // 这里需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
        // excel中表的列要与对象的字段相对应
        EasyExcel.read(filename, Student.class, new AnalysisEventListener<Student>() {

            // 每解析一条数据都会调用该方法
            @Override
            public void invoke(Student student, AnalysisContext analysisContext) {
                System.out.println("解析一条Student对象:" + JSON.toJSONString(student));
                studentList.add(student);
            }

            // 解析完毕的回调方法
            @Override
            public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                System.out.println("excel文件读取完毕!");
            }

            //读取完头数据进行调用
            @Override
            public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
                System.out.println("头数据" + JSON.toJSONString(headMap));
            }
        }).doReadAll();

        System.out.println(studentList);
    }
}

console

头数据{0:"姓名",1:"年龄",2:"地址",3:"余额"}
解析一条Student对象:{"address":"广东省深圳市","age":22,"money":6543.0,"stu_name":"张三"}
解析一条Student对象:{"address":"湖北省武汉市","age":18,"money":4900.0,"stu_name":"李四"}
解析一条Student对象:{"address":"云南省昆明市","age":36,"money":5200.0,"stu_name":"王五"}
excel文件读取完毕!
头数据{0:"姓名",1:"年龄",2:"地址",3:"余额"}
解析一条Student对象:{"address":"广东省深圳市","age":22,"money":6543.0,"stu_name":"张三"}
解析一条Student对象:{"address":"湖北省武汉市","age":18,"money":4900.0,"stu_name":"李四"}
解析一条Student对象:{"address":"云南省昆明市","age":36,"money":5200.0,"stu_name":"王五"}
excel文件读取完毕!

写入

先简单了解一下 ,不学了

import com.alibaba.excel.EasyExcel;

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

public class WriteTest {


    public static void main(String[] args) {
        List<Student> students = generatorData();
        System.out.println(students);

        
        //定义fileName
        String fileName = "simpleWrite" + System.currentTimeMillis() + ".xlsx";
        // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
        // 如果这里想使用03 则 传入excelType参数即可
        EasyExcel.write(fileName, Student.class).sheet("模板").doWrite(students);

    }


    /**
     * 生成数据
     * @return List<Student>
     */
    public static List<Student> generatorData(){
        ArrayList<Student> students = new ArrayList<Student>();


        for (int i = 0; i <10; i++) {
            Student student = new Student("test"+i,i,"address"+i, i+0.1F);
            students.add(student);

        }

        return students;
    }
}
posted @ 2021-04-15 14:51  immortal_mode  阅读(223)  评论(0)    收藏  举报