1.业务代码
//EasyExcel.read(文件输入流, 实体类对象,监听器).sheet().doRead();
import com.alibaba.excel.EasyExcel;
public void addFile(MultipartFile file) throws Exception {
EasyExcel.read(file.getInputStream(), Test.class,new ExcelImportTest(service)).sheet().doRead();
}
2.实体类代码
@Data
public class Test implements Serializable {
/**
* 姓名
*/
@ExcelProperty(value = "姓名", index = 0)
private String name;
/**
* 性别:0-女 1-男 2-其他
*/
@ExcelProperty(value = "性别", index = 1)
private String sex;
/**
* 年龄
*/
@ExcelProperty(value = "年龄", index = 2)
private String age;
}
3.监听器
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.exception.ExcelDataConvertException;
import com.xlkj.base.ex.BizException;
import com.xlkj.dao.domain.dto.HjCustomerImportDTO;
import com.xlkj.service.service.call.HjCustomerService;
import com.xlkj.system.response.LoginUserRpcResponse;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.List;
@Slf4j
public class ExcelImportTest extends AnalysisEventListener {
/**
* 每次读取的最大数据条数
*/
private static final int MAX_BATCH_COUNT = 10;
/**
* 泛型bean属性
*/
private TestService service;
/**
* 可接收任何参数的泛型List集合
*/
List<Test> testDTOS = new ArrayList<>();
/**
* 构造函数注入bean(根据传入的bean动态注入)
*/
public ExcelImportTest(TestService service) {
this.service = service;
}
/**
* 解析每条数据都进行调用
*
* @param data
* @param context
*/
@Override
public void invoke(Object data, AnalysisContext context) {
log.info(" ==> 解析一条数据: {}", data);
testDTOS.add((Test) data);
if (testDTOS.size() > MAX_BATCH_COUNT) {
// 保存数据
saveData();
// 清空list
testDTOS.clear();
}
}
/**
* 所有数据解析完成后,会来调用一次
* 作用: 避免最后集合中小于 MAX_BATCH_COUNT 条的数据没有被保存
*
* @param context
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
saveData();
log.info(" ==> 数据解析完成 <==");
}
/**
* 保存数据: 正式应该插入数据库,这里用于测试
*/
private void saveData() {
log.info(" ==> 数据保存开始: {}", testDTOS.size());
service.saveImportDTO(testDTOS); //业务层处理方法
log.info(" ==> 数据保存结束 <==");
}
/**
* 在转换异常 获取其他异常下会调用本接口。我们如果捕捉并手动抛出异常则停止读取。如果这里不抛出异常则 继续读取下一行。
*/
@Override
public void onException(Exception exception, AnalysisContext context) throws Exception {
log.error(" ==> 数据解析失败,但是继续读取下一行:{}", exception.getMessage());
// 如果是某一个单元格的转换异常 能获取到具体行号
if (exception instanceof ExcelDataConvertException) {
ExcelDataConvertException convertException = (ExcelDataConvertException) exception;
throw new BizException("第" + convertException.getRowIndex() + "行,第" + convertException.getColumnIndex() + "列数据解析异常");
}
throw exception;
}
}
拿到即用不解释,自己悟,自己嚼的馒头最香;