maven依赖
<!--easypoi与SpringBoot的整合包-->
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-spring-boot-starter</artifactId>
<version>4.1.2</version>
</dependency>
下面是具体实现方法
public AjaxResult importData(MultipartFile file, String seriesCode) {
try {
ImportParams params = new ImportParams();
params.setHeadRows(1);
params.setNeedVerify(true);
//自定义校验
params.setVerifyHandler(importVerify);
params.setVerifyFileSplit(false);
List<TGatherAccountingFolder> success = null;
Map<String, Object> res = new HashMap<>();
List<String> errMsgList = new ArrayList<>();
long millis = System.currentTimeMillis();
//ExcelImportUtil.importExcelMore 直接调用
ExcelImportResult<TGatherAccountingFolder> result = ExcelImportUtil.importExcelMore(file.getInputStream(), TGatherAccountingFolder.class, params);
success = result.getList();
//失败结果集
List<TGatherAccountingFolder> failList = result.getFailList();
//验证是否有失败的数据
if (result.isVerifyFail()) {
for (TGatherAccountingFolder accountFolder : failList) {
errMsgList.add("第" + accountFolder.getRowNum() + "条 ," + accountFolder.getErrorMsg());
}
res.put("errMsg", errMsgList);
res.put("msg", "失败" + failList.size() + "条");
return AjaxResult.error("导入失败", res);
} else {
//导入序号和册号规则
if (success.get(0).getfCeh() != 1) {
errMsgList.add("第一条记录册号填写错误");
}
for (int i = 0; i < success.size(); i++) {
if (success.get(i).getfSort() - i != 1) {
errMsgList.add("序号不连续");
}
for (int j = i + 1; j < success.size(); j++) {
int ce = success.get(j).getfCeh() - success.get(i).getfCeh();
if (success.get(j).getfCeh() > success.get(i).getfCeh() && ce != 1) {
errMsgList.add("第" + success.get(j).getfSort() + "条记录册号填写错误");
}
break;
}
}
if (null != errMsgList && errMsgList.size() > 0) {
res.put("errMsg", errMsgList);
return AjaxResult.error("导入失败", res);
}
int i = DateUtil.thisYear();
for (TGatherAccountingFolder accountFolder : success) {
//导入成功的数据 进行持久化操作
}
super.saveBatch(success);
//操作日志
return AjaxResult.success(success);
}
} catch (Exception e) {
e.printStackTrace();
}
return AjaxResult.success();
}
其中 params.setVerifyHandler(importVerify); 为添加自定义校验方法,对实体中单个对象的业务逻辑进行校验:
@Component
public class AccountingImportVerify implements IExcelVerifyHandler<TGatherAccountingFolder> {
@Resource
private ITGatherAccountingFolderService folderService;
@Resource
private DepositVerify depositVerify;
@Resource
private ITUseSimpleQueryAccountingService accountingService;
@Override
public ExcelVerifyHandlerResult verifyHandler(TGatherAccountingFolder accountingFolder) {
//设置默认验证为true
ExcelVerifyHandlerResult excelVerifyHandlerResult = new ExcelVerifyHandlerResult(true);
//归档年度
int thisYear = DateUtil.thisYear();
if (null != accountingFolder.getfYearCode()){
if (!Pattern.matches(GatherConstant.REGEX_YEAR, accountingFolder.getfYearCode().toString()) || accountingFolder.getfYearCode() > thisYear){
excelVerifyHandlerResult.setSuccess(false);
excelVerifyHandlerResult.setMsg(StringUtils.isNotEmpty(excelVerifyHandlerResult.getMsg())?excelVerifyHandlerResult.getMsg()+"形成年度格式不正确," : "" +"形成年度格式不正确,");
}
}
//条形码
if (StringUtils.isNotEmpty(accountingFolder.getfBarcodeNo())){
List<TGatherAccountingFolder> barCode = folderService.list(new QueryWrapper<TGatherAccountingFolder>().lambda()
.eq(TGatherAccountingFolder::getfBarcodeNo, accountingFolder.getfBarcodeNo()));
if (null != barCode && barCode.size() > 0){
excelVerifyHandlerResult.setSuccess(false);
excelVerifyHandlerResult.setMsg(StringUtils.isNotEmpty(excelVerifyHandlerResult.getMsg()) ? excelVerifyHandlerResult.getMsg()+ "条形码重复!": "条形码重复!");
}
List<TUseSimpleQueryAccountingFolderEntity> barCodeCore = accountingService.list(new QueryWrapper<TUseSimpleQueryAccountingFolderEntity>().lambda()
.eq(TUseSimpleQueryAccountingFolderEntity::getfBarcodeNo, accountingFolder.getfBarcodeNo()));
if (null != barCodeCore && barCodeCore.size() > 0){
excelVerifyHandlerResult.setSuccess(false);
excelVerifyHandlerResult.setMsg(StringUtils.isNotEmpty(excelVerifyHandlerResult.getMsg()) ? excelVerifyHandlerResult.getMsg()+ "条形码重复!": "条形码重复!");
}
}
return excelVerifyHandlerResult;
}
}
实体对象中可添加easypoi的 @Excel 即可: