使用EasyExcel读取和写入表格

本文介绍了如何使用EasyExcel进行Excel的读取和写入操作,包括自定义转换器来处理特定数据类型的转换。通过示例展示了读取Excel时的数据对象映射、监听器的使用,以及在遇到需要转换的数据(如性别1代表男,2代表女)时,自定义转换器的实现过程。同时,文章还演示了写入Excel时如何利用转换器将数据正确写入。
摘要由CSDN通过智能技术生成

读取Excel

首先我创建了一个Excel的文件,数据如下
在这里插入图片描述

读取excel在EasyExcel中是很简单的一件事情,首先,我们需要有对象去存储一条条数据,所以这里我建立了一个Student对象,有如下四个字段,并分别赋予了get和set方法

    @ExcelProperty(value = "姓名")
    private String name;
    @ExcelProperty(value = "年龄")
    private Integer age;
    @ExcelProperty(value = "介绍")
    private String content;
    @ExcelProperty(value = "日期")
    private Date bornDate;

@ExcelProperty该注解就是映射表头的,value的值就是Excel中实际的表头数据
接下来创建读取数据需要用到的监听器类

//这是最简单的监听器了,如果需要存储到数据库可以参考EasyExcel的官方文档,写的很详细
public class StudentListener extends AnalysisEventListener<Student> {

    @Override
    public void invoke(Student data, AnalysisContext context) {
    	//每读取一条数据就调用该方法一次,我这里没有与数据库进行交互,纯输出读取到的对象
        System.out.println(data);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
    	//读取结束会调用该方法
        System.out.println("end...");
    }
}

接下来调用主方法进行读取

    public static void main(String[] args) {
        String path = "D:\\stu.xlsx"; //excel文件路径
        EasyExcel.read(path, Student.class,new StudentListener()).sheet().doRead();
    }
    //输出的结果为
    //Student{name='小明', age=12, content='我是小明', bornDate=Tue Jan 02 12:12:11 CST 1900}
	//end...

我们可以看到已经成功读取了数据并输出到控制台。

转换器的使用

有的时候,我们在读取excel表格时,并不会像刚才这样方便,例如,我在表格中新增一列性别,内容为1
在这里插入图片描述
我们规定,1=男,2=女,那么在Student对象中需要同步增加一个属性String sex

    @ExcelProperty(value = "姓名")
    private String name;
    @ExcelProperty(value = "年龄")
    private Integer age;
    @ExcelProperty(value = "介绍")
    private String content;
    @ExcelProperty(value = "日期")
    private Date bornDate;
    @ExcelProperty(value = "性别")
    private String sex;

现在我们如果再调用主方法进行读取表格时,就会发现输出时不符合我的想象

//Student{name='小明', age=12, content='我是小明', bornDate=Tue Jan 02 12:12:11 CST 1900, sex='1'}
//end...

我想让他以这样形式进行输出

//Student{name='小明', age=12, content='我是小明', bornDate=Tue Jan 02 12:12:11 CST 1900, sex='男'}
//end...

这时就需要使用到转换器帮我们处理了,创建转换器需要实现Converter<T>接口,该接口有一些已经默认实现的方法(default),我们只需要按需求重写方法即可

/**
 * @Description Sex转换器
 * @Author syk
 * @Date2022/10/18
 **/
 //这里泛型写处理Java的属性的类型
public class SexConverter implements Converter<String> {
    @Override
    public Class<?> supportJavaTypeKey() {  //Java支持的类型
        return String.class;
    }

    @Override
    public CellDataTypeEnum supportExcelTypeKey() { //Excel支持的类型
        return CellDataTypeEnum.STRING;
    }

	//转换到Java类型
    @Override
    public String convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        //由于Excel表格中该列的格式为数值型,所以映射到这里需要使用getNumberValue进行读取,读取到的值为1.0。所以需要和1.0进行匹配
        BigDecimal numberValue = cellData.getNumberValue();
        return (numberValue+"").equals("1.0") ? "男" : "女";
    }
}

转换器写好之后,我们将它放在Student对象上的注解上即可

    @ExcelProperty(value = "性别" , converter = SexConverter.class) //引用该转换器

这样在程序读取/写入Excel时,遇到这一列则会使用该转换器进行处理,我们这里的转换器没有重写写入的方法,只重写了读取赋值的方法。
现在已经万事大吉了,我们再次调用主方法看一下

//Student{name='小明', age=12, content='我是小明', bornDate=Tue Jan 02 12:12:11 CST 1900, sex='男'}
//end...

可以看到,成功转换了!

写Excel

写入Excel也是很简单的事情,还是以上文中的读Excel为例子,现在,我在转换器中重写写入的方法,然后进行写Excel的操作
重写后的转换器类

public class SexConverter implements Converter<String> {
    @Override
    public Class<?> supportJavaTypeKey() {
        return String.class;
    }

    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }

    @Override
    public String convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        //由于Excel表格中该列的格式为数值型,所以映射到这里需要使用getNumberValue进行读取,读取到的值为1.0。所以需要和1.0进行匹配
        BigDecimal numberValue = cellData.getNumberValue();
        return (numberValue+"").equals("1.0") ? "男" : "女";
    }

    @Override
    public WriteCellData<?> convertToExcelData(String value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
    	//这里重写了写入Excel表格时对于Sex属性的处理,遇到字符串1则转换到Excel中为"男",否则为"女"
        return value.equals("1") ? new WriteCellData<String>("男") : new WriteCellData<String>("女");
    }

}

调用主方法进行测试

    public static void main(String[] args) {
        String path = "D:\\stu.xlsx"; //excel文件路径
        Student student1 = new Student("小王",12,"他是小王",new Date(),"1");
        Student student2 = new Student("小丽",18,"他是小丽",new Date(),"0");
        List<Student> list = new ArrayList<Student>();
        list.add(student1);
        list.add(student2);
        EasyExcel.write(path, Student.class).sheet("info").doWrite(list);
        //				路径  要处理的类class	 sheet的名称        需要写入的List对象
        System.out.println("End...");
    }

这里运行也是没问题的,我们看一下表格的内容
在这里插入图片描述
这里也是成功输出了,如果想实现更多功能可以去EasyExcel官网查看更多API

小提示

对于Converter<T>转换器接口,默认有六个方法,全部都是被default修饰的,所以在我们实现该接口的时候不需要全部重写,只需要按照需求去重写就可以了。
我们看一下该接口的六个方法

package com.alibaba.excel.converters;

import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;

/**
 * Convert between Java objects and excel objects
 *
 * @param <T>
 * @author Dan Zheng
 */
public interface Converter<T> {

    /**
     * Back to object types in Java
     *
     * @return Support for Java class
     */
    default Class<?> supportJavaTypeKey() {
        throw new UnsupportedOperationException("The current operation is not supported by the current converter.");
    }

    /**
     * Back to object enum in excel
     *
     * @return Support for {@link CellDataTypeEnum}
     */
    default CellDataTypeEnum supportExcelTypeKey() {
        throw new UnsupportedOperationException("The current operation is not supported by the current converter.");
    }

    /**
     * Convert excel objects to Java objects
     *
     * @param cellData            Excel cell data.NotNull.
     * @param contentProperty     Content property.Nullable.
     * @param globalConfiguration Global configuration.NotNull.
     * @return Data to put into a Java object
     * @throws Exception Exception.
     */
    default T convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty,
        GlobalConfiguration globalConfiguration) throws Exception {
        throw new UnsupportedOperationException("The current operation is not supported by the current converter.");
    }

    /**
     * Convert excel objects to Java objects
     *
     * @param context read converter context
     * @return Data to put into a Java object
     * @throws Exception Exception.
     */
    default T convertToJavaData(ReadConverterContext<?> context) throws Exception {
        return convertToJavaData(context.getReadCellData(), context.getContentProperty(),
            context.getAnalysisContext().currentReadHolder().globalConfiguration());
    }

    /**
     * Convert Java objects to excel objects
     *
     * @param value               Java Data.NotNull.
     * @param contentProperty     Content property.Nullable.
     * @param globalConfiguration Global configuration.NotNull.
     * @return Data to put into a Excel
     * @throws Exception Exception.
     */
    default WriteCellData<?> convertToExcelData(T value, ExcelContentProperty contentProperty,
        GlobalConfiguration globalConfiguration) throws Exception {
        throw new UnsupportedOperationException("The current operation is not supported by the current converter.");
    }

    /**
     * Convert Java objects to excel objects
     *
     * @param context write context
     * @return Data to put into a Excel
     * @throws Exception Exception.
     */
    default WriteCellData<?> convertToExcelData(WriteConverterContext<T> context) throws Exception {
        return convertToExcelData(context.getValue(), context.getContentProperty(),
            context.getWriteContext().currentWriteHolder().globalConfiguration());
    }
}

我们可以看到convertToJavaDataconvertToExcelData方法都有两个不同的默认实现,当时我还比较纳闷为什么会有两个同名的方法,虽然我知道是重载,后来才知道在其中一个方法中调用了另一个重载方法。图解如下(该图以convertToExcelData为例,convertToJavaData是一样的道理)
在这里插入图片描述
所以,如果你需要自定义转换器,只需要实现其中任意一个接口方法就可以了

Excel中的数据类型

点击查看

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值