起因:工作中有同事使用Easy Excel解析上传的Excel文件,记录一下使用方式,其实官方文档写的够详细了,官方文档:
https://easyexcel.opensource.alibaba.com/docs/current/
使用:
- 引入
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.3</version>
</dependency>
- 建议分包管理,要用到Easy Excel的子项目下新建一个包,任意名字
例如 com.alibaba.testEasyExcel
- 包下创建两个类,一个
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());
}
}
}
- 读取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