您的位置:首页 > 编程语言 > Java开发

通过捕获异常校验excel文件导入数据重复性(spring boot)

2019-01-07 23:27 627 查看

最近在项目中遇到一个需求,在excel导入中要对流水号这个字段进行重复性校验,不仅excel文件中该字段不能重复,而且要与数据库表中该字段也不能重复,若重复的话要进行提示,场景比较简单,如果导入的数据与数据库表中的数据重复,该如何精确高校的提示呢?如果和表中的数据进行比较,且数据量比较大的话,可能会导致堆内存溢出,下面通过建立唯一索引,通过捕获异常来实现;

/** excel上传
*/
@PostMapping("excelUpload.do")
public ResultResponse excelUpload(@RequestParam("file") MultipartFile file ) {
ResultResponse response = new ResultResponse <>();
long MAX_SIZE = 3 * 1024 * 1024;// 设置上传文件最大为 3M
if (file.getSize() > MAX_SIZE){
response.setMessage( "上传Excel文件不超过3M" );
return response;
}
//开始行 第一行是列名
int startRow = 1;
//excel列
String[] column = new String[]{ID, DM, RQ, JE, JGHM, LSH};

try {
//1.把excel转化为list,工具类就不帖出来了哈
response = ExcelImportPoi.excelToList( file, startRow, column );
List<Map<String, Object>> excelList = (List<Map<String, Object>>) response.getData();
if (null == excelList || excelList.size() == 0) {
response.setMessage( "excel没有数据" );
return response;
}

Set<String> dataSet= new HashSet<String>();
for (int i = 0; i < excelList.size(); i++) {
Map taxItemMap = excelList.get( i );
Object lsh = taxItemMap.get(LSH);
if(!dataSet.add(lsh.toString())){
response.setCode("999");
response.setMessage("第"+(i+1)+"行流水号在Excel中存在重复数据!");
return response;
}
}
//入库操作
batchInsertService.batchInsertTaxItem(excelList);
response.setCode("000");
response.setMessage("导入数据成功!");

}catch (DuplicateKeyException e) {
log.error( "上传excel异常,异常信息:" + e.getMessage() );
response.setCode("999");
String[] split = e.getCause().toString().split("'");
response.setMessage("流水号"+split[1]+"已存在,请勿重复上传");
return response;
}catch (Exception e) {
log.error( "上传excel异常,异常信息:" + e.getMessage() );
response.setCode("9999");
response.setMessage( "上传excel异常,异常信息:" + e.getMessage() );
}
return response;
}

以上方式供大家参考,如有更好的方式大家可以分享。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: