Easy Excel 解析Excel

起因:工作中有同事使用Easy Excel解析上传的Excel文件,记录一下使用方式,其实官方文档写的够详细了,官方文档:
https://easyexcel.opensource.alibaba.com/docs/current/

使用

  1. 引入
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>easyexcel</artifactId>
	<version>2.2.3</version>
</dependency>
  1. 建议分包管理,要用到Easy Excel的子项目下新建一个包,任意名字

例如 com.alibaba.testEasyExcel

  1. 包下创建两个类,一个 DemoData.class,一个 DemoDataLisenter.class

解释:

  • DemoData.class
    相当于数据库表的实体类,和实体类跟数据表的关系一样,是Excel表的实体类,类属性与表的列对应,不过是使用特殊注解声明关系
    注解:去官网看吧,人家解释的通俗易懂
  • DemoDataLisenter.class
    监听器,里面声明了读取Excel每一行之后执行的方法(invoke)、读取单个Excel文件结束之后执行的方法(doAfterAllAnalysed)、单行数据读取异常处理方法(onException)、一行一行读取Excel表头方法(invokeHeadMap)、读取Excel单元格超链接批注等额外信息的方法(extra)等
  • 示例代码看下面

在这里插入图片描述

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

import java.math.BigDecimal;

/**
 * Excel导入数据对象-物料明细
 */
@Data
public class MaterialData {
    /**
     * 物料名称
     */
    @ExcelProperty("物料名称")
    private String materialName;

    @ExcelIgnore
    private Long materialId;

    /**
     * 物料类别名称
     */
    @ExcelProperty("物料类别")
    private String categoryName;

    @ExcelIgnore
    private Long categoryId;

    @ExcelIgnore
    private Long unitId;

    /**
     * 金额
     */
    @ExcelProperty("价格")
    private BigDecimal price;

    /**
     * 单位
     */
    @ExcelProperty("单位")
    private String unitString;


    /**
     * 备注
     */
    @ExcelProperty("备注")
    private String remark;
}
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.exception.ExcelDataConvertException;
import com.自己的异常处理包.BadRequestException;
import lombok.extern.slf4j.Slf4j;

import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;

@Slf4j
public class MaterialDataListener extends AnalysisEventListener<MaterialData> {
    List<MaterialData> list = new ArrayList<MaterialData>();

    @Override
    public void invoke(MaterialData MaterialData, AnalysisContext analysisContext) {

    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        log.info("表数据解析完成");
    }

    @Override
    public void onException(Exception exception, AnalysisContext context) {
        // 如果是某一个单元格的转换异常 能获取到具体行号
        // 如果要获取头的信息 配合invokeHeadMap使用
        if (exception instanceof ExcelDataConvertException) {
            ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException)exception;
            log.error("第{}行,第{}列解析异常,数据为:{}", excelDataConvertException.getRowIndex()+1,
                excelDataConvertException.getColumnIndex(), excelDataConvertException.getCellData());
        }
    }
}
  1. 读取Excel
@Test
public void exceptionRead(MultipartFile file) {
    List<MaterialData> materialList = Arrays.asList(EasyExcel.read(file.getInputStream()).sheet(0).head(DemoData.class).registerReadListener(new DemoDataListener()).doReadSync().toArray(new DemoData[0]));
    if (materialList.isEmpty()) {
        throw new BadRequestException("物料信息读取失败");
    }
}

如果只是简单的使用读取Excel,看到这里足够了,深入探究的的话,推荐一个大佬的文章,讲的十分详细
大佬的文章:https://blog.youkuaiyun.com/u010957645/article/details/101362194

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值