美文网首页
校验表格中行与行之间是否有某一列或者某几列重复数据

校验表格中行与行之间是否有某一列或者某几列重复数据

作者: 墨色尘埃 | 来源:发表于2018-02-04 21:05 被阅读30次

    方法一:每读取一行数据就放入集合,该行数据和集合作比对(行数多的时候会卡死),如果该行数据没有和集合中的数据重复就添加进集合,但是有一个问题,如果直接添加进集合A会导致数组越界(不能在for循环里面再添加数据到集合中),所以将该数据添加进新集合B,等A集合循环结束后清空A,将B赋值给A。动态添加会容易导致问题

    /**
         * 验证excel每行数据方法一
         * rowData下一条数据
         * rowDatas excel表格所有数据
         * splicingValue excel中某一行的某一列数据
         **/
        public void validateRowData(List<RowData> rowDatas, List<RowData> rowDatasCopy,
                                    RowData rowData, String splicingValue, String entityName) {
            rowDatas.clear();
            rowDatas.addAll(rowDatasCopy);
            if (rowDatas != null && rowDatas.size() > 0) {
                for (RowData data : rowDatas) {   //data上一条数据
                    if (splicingValue != null && !"".equals(splicingValue)) {
                        if (splicingValue.equals(data.getSplicingValue())) {
                            if (entityName.equals(ParseConstans.ENTERPRISE_INVEST_DETAIL)) {
                                errorString.append("第" + rowData.getRow() + "行第" + rowData.getUsccColumn() + "列、第" +
                                        rowData.getMonthColumn() + "列、第" + rowData.getTypeColumn() + "列不能和第" +
                                        data.getRow() + "行第" + data.getUsccColumn() +
                                        "列、第" + data.getMonthColumn() + "列、第" + data.getTypeColumn() + "列完全相同" + "<br>");
                            } else if (entityName.equals(ParseConstans.ENTERPRISE_BASE)) {
                                errorString.append("第" + rowData.getRow() + "行第" + rowData.getUsccColumn() + "列不能和第" +
                                        data.getRow() + "行第" + data.getUsccColumn() + "列完全相同" + "<br>");
                            } else {
                                errorString.append("第" + rowData.getRow() + "行第" + rowData.getUsccColumn() + "列、第" +
                                        rowData.getMonthColumn() + "列不能和第" + data.getRow() + "行第" + data.getUsccColumn() +
                                        "列、第" + data.getMonthColumn() + "列完全相同" + "<br>");
                            }
                        } else {
                            //rowDatas.add(rowData); //在for循环里面添加数据是错误的,切记!!
                            //集合去重并且按照自然顺序排列
                            rowDatasCopy.add(rowData);
                            List<RowData> newList = new ArrayList<>(new TreeSet<>(rowDatasCopy));
                            rowDatasCopy.clear();
                            rowDatasCopy.addAll(newList);
                        }
                    }
                }
            } else {
                rowDatas.add(rowData);
                rowDatasCopy.add(rowData);
            }
        }
    

    方法二:将excel表格所有数据存放到集合中,对集合进行双重for循环(效率高)。不像方法一,这种方法比较起来更加高效快捷。

     /**
         * 验证excel每行数据方法二
         * rowDatas excel表格中所有数据
         **/
        public void validateRowData(List<RowData> rowDatas, String entityName) {
            for (RowData rowData : rowDatas) {
                String splicingValue = rowData.getSplicingValue();
                int row = rowData.getRow();
                if (splicingValue != null && !"".equals(splicingValue)) {
                    for (RowData data : rowDatas) {
                        if (row != data.getRow()) {
                            if (splicingValue.equals(data.getSplicingValue())) {
                                if (entityName.equals(ParseConstans.ENTERPRISE_INVEST_DETAIL)) {
                                    errorString.append("第" + rowData.getRow() + "行第" + rowData.getUsccColumn() + "列、第" +
                                            rowData.getMonthColumn() + "列、第" + rowData.getTypeColumn() + "列不能和第" +
                                            data.getRow() + "行第" + data.getUsccColumn() +
                                            "列、第" + data.getMonthColumn() + "列、第" + data.getTypeColumn() + "列完全相同" +
                                            "<br>");
                                } else if (entityName.equals(ParseConstans.ENTERPRISE_BASE)) {
                                    errorString.append("第" + rowData.getRow() + "行第" + rowData.getUsccColumn() +
                                            "列不能和第" +
                                            data.getRow() + "行第" + data.getUsccColumn() + "列完全相同" + "<br>");
                                } else {
                                    errorString.append("第" + rowData.getRow() + "行第" + rowData.getUsccColumn() + "列、第" +
                                            rowData.getMonthColumn() + "列不能和第" + data.getRow() + "行第" + data
                                            .getUsccColumn() +
                                            "列、第" + data.getMonthColumn() + "列完全相同" + "<br>");
                                }
                            }
                        }
                    }
                }
            }
    
            //验证excel表格中数据与数据库中数据
            Map map = new HashMap();
            map = CommonUtil.convertFormData(map);
            validateRowData1(rowDatas, entityName, map);
        }
    

    注:如果只是对行与行之间的某一列进行重复校验,那么就更简单了,只需要将该列数据放入集合

        if (list.contains(cellValue)) {
            errorString.append("第" + curRow + "行,第" + curCol + "列:" + rulMsg + "<br>");
        } else {
            list.add(cellValue);
        }
    

    相关文章

      网友评论

          本文标题:校验表格中行与行之间是否有某一列或者某几列重复数据

          本文链接:https://www.haomeiwen.com/subject/urrvzxtx.html