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

最近在项目中遇到一个需求,在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;
    }

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

猜你喜欢

转载自blog.csdn.net/qq_29730977/article/details/86035600