Excel导入大量数据,同时校验Excel中数据以及数据库是否存在重复数据

   1.共享数据,减少数据查询

      业务需求:  导入房屋信息,房屋信息包括项目编号,楼栋编号,楼层号,房屋号

      如果系统中已存在深圳大区,金色家园,1栋,102房屋,Excel中刚好有深圳大区,金色家园,1栋102房屋这条记录,又或者Excel中的信息是这样子的 --深圳大区,金色家园,1栋,102,仅仅是名字不一样了,或者信息不对。。。。

       思维:将数据库中的数据同步到redis,做文件导入的时候,一条一条的和缓存中数据对比,如果大区+楼栋+楼层不存在,可以插入,同理,如果大区+楼栋+楼层存在,数据库有数据,尽量避免修改。如果不存在,则增加到缓存中,否则,将数据加入新的集合返回给客户端。这样就可以保证Excel中的数据插入数据库唯一。

       注意:由于数据库中的数据大部分都是从CRM系统同步过来的,数据信息价值较高,然而,数据导入可能是由公司员工或者地区管理员使用,操作可能不够规范或者不正确。所以,当时我采取的措施是:尽量只能做新增操作,避免做更新操作。

@Component
public class AcsPropertyFactory {

    @Autowired
    private RedisOperatorManager redisOperatorManager;

    /*    private PropertyExcelVo crmPropertyEntity;

    public PropertyExcelVo getCrmPropertyEntity() {
        return crmPropertyEntity;
    }
    public void PropertyExcelVo(PropertyExcelVo crmPropertyEntity) {
        this.crmPropertyEntity = crmPropertyEntity;
    }*/

    /**
     * 享元模式:
     * 数据量大,集合太耗费资源,所以使用redis每次进行查询
     */

    //存数据库中该楼栋下所有的房屋名
    // private   Map<String, String> persistDataPool ;
    //ufrData:key,单元-楼层-房号
    // private   Map<String, String> ufrDataPool;


    /**
     * 存数据库中该楼栋下所有的房屋名
     *
     * @param property
     * @return
     */
    public boolean isHavePersistData(PropertyExcelVo property) {
        if (StringUtils.isNotBlank(property.getUnit()) && StringUtils.isNotBlank(property.getFloor()) && StringUtils.isNotBlank(property.getRoomNumber())) {
            String keyName = property.getPropertyName();
            Object hashObjValue = redisOperatorManager.getHashObjValue(CommonConstants.CRM_PROPETY_NAME, keyName, CommonConstants.CRM_REDIS_DB_INDEX);
            if (null != hashObjValue) {
                return true;
            } else {
                redisOperatorManager.addHashValue(CommonConstants.CRM_PROPETY_NAME, keyName, property, CommonConstants.CRM_REDIS_DB_INDEX);
                return false;
            }
        }
        return true;
    }

    /**
     * ufrData:key,单元-楼层-房号
     *
     * @param property
     * @return
     */
    public boolean isHaveUfrData(PropertyExcelVo property) {
        if (StringUtils.isNotBlank(property.getUnit()) && StringUtils.isNotBlank(property.getFloor()) && StringUtils.isNotBlank(property.getRoomNumber())) {
            String keyName = property.getUnit() + "-" + property.getFloor() + "-" + property.getRoomNumber();
            Object hashObjValue = redisOperatorManager.getHashObjValue(CommonConstants.CRM_PROPETY, keyName, CommonConstants.CRM_REDIS_DB_INDEX);
            if (null != hashObjValue) {
                return true;
            } else {
                redisOperatorManager.addHashValue(CommonConstants.CRM_PROPETY, keyName, property, CommonConstants.CRM_REDIS_DB_INDEX);
                return false;
            }
        }
        return true;
    }


 2.Excel数据处理

     //处理Excel数据
        for (PropertyExcelVo propertyExcelVo : propertyExcelVos) {
            String propertyName = propertyExcelVo.getPropertyName();
            String roomNumber = propertyExcelVo.getRoomNumber();
            String keyName = propertyExcelVo.getUnit() + "-" + propertyExcelVo.getFloor() + "-" + propertyExcelVo.getRoomNumber();
            // String setKeyName = vo.getUnit() + "-" + vo.getFloor() + "-" + vo.getRoomNumber() + "-" + vo.getPropertyName();
            //验证长度
            if (propertyName.length() > CommonConstants.PROPERTY_NAME_MAX_LENGTH
                    || roomNumber.length() > CommonConstants.ROOM_NUMBER_MAX_LENGTH
                    || propertyExcelVo.getUnit().length() > CommonConstants.UNIT_MAX_LENGTH
                    || propertyExcelVo.getFloor().length() > CommonConstants.FLOOR_MAX_LENGTH) {
                //fillData(propertyExcelVo, errList);
                propertyExcelVo.setCheckMsg("字段格式非法");
                errList.add(propertyExcelVo);
                continue;
            }
            //判断数据库是否已经存在该房子名
            if (acsPropertyFactory.isHavePersistData(propertyExcelVo)) {
                //该房屋名字已经存在
                //fillData(vo, errList);
                propertyExcelVo.setCheckMsg("房屋名已存在");
                errList.add(propertyExcelVo);
                continue;
            }
            //判断数据库是否已经存在 单元-楼层-房间号
            if (acsPropertyFactory.isHaveUfrData(propertyExcelVo)) {
                //该房间已经存在
                //fillData(propertyExcelVo, errList);
                propertyExcelVo.setCheckMsg("单元-楼层-房间号已存在");
                errList.add(propertyExcelVo);
                continue;
            } else {
                ufrData.put(keyName.trim(), "1");
            }
            //新增
            CrmPropertyEntity crmPropertyEntity = new CrmPropertyEntity();
            BeanUtils.copyProperties(propertyExcelVo, crmPropertyEntity);
            crmPropertyEntity.createId();
            crmPropertyEntity.setShortName("");
            crmPropertyEntity.setProjectCode(projectCode);
            crmPropertyEntity.setBuildingCode(buildingCode);
            crmPropertyEntity.setBuildingName(buildingName);
            crmPropertyEntity.setPropertyCode(UUID.randomUUID().toString().replace("-", ""));
            crmPropertyEntity.setActiveFlag(BasePlatEntity.ACTIVE_FLAG_NORMAL);
            crmPropertyEntity.setDataSource(CrmConstant.DATASOURCE_LOCAL);
            crmPropertyEntity.setOperateUser(getCurrentUser());
            crmPropertyEntity.setOperateDate(DateFormatUtils.format(System.currentTimeMillis(), CommonConstants.DATE_PATTERN_19));
            crmPropertyEntity.setRemarks("excel导入");
            crmPropertyEntity.setTenantLimit(CommonConstants.PROPERTY_TENANT_LIMIT_DEFAULT);
            addList.add(crmPropertyEntity);
        }

 

  • 7
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
在将 Excel 数据导入到 MySQL 数据库时,你可以使用参数校验来确保导入的字段满足要求。下面是一个示例代码,展示了如何进行参数校验: ```go import ( "errors" "fmt" "strconv" ) // 检查字段是否为空 func validateFieldNotEmpty(field string) error { if field == "" { return errors.New("字段不能为空") } return nil } // 检查字段是否为有效的整数 func validateFieldIsInteger(field string) error { _, err := strconv.Atoi(field) if err != nil { return fmt.Errorf("字段不是有效的整数: %s", field) } return nil } // 示例代码:从 Excel 导入数据到 MySQL func importExcelDataToMySQL(data [][]string) error { for _, row := range data { if err := validateFieldNotEmpty(row[0]); err != nil { return err } if err := validateFieldIsInteger(row[1]); err != nil { return err } // 在这里执行插入数据库的操作 // ... } return nil } func main() { // 假设从 Excel 读取到的数据是一个二维字符串数组 excelData := [][]string{ {"John Doe", "25"}, {"Jane Smith", "30"}, {"", "abc"}, } err := importExcelDataToMySQL(excelData) if err != nil { fmt.Println("导入数据发生错误:", err) } } ``` 在上述示例,我们定义了两个参数校验函数:`validateFieldNotEmpty` 用于检查字段是否为空,`validateFieldIsInteger` 用于检查字段是否为有效的整数。在 `importExcelDataToMySQL` 函数,我们根据需要调用这些校验函数来验证每个字段的合法性。如果校验失败,将返回相应的错误信息。 你可以根据实际需求扩展和改进这些参数校验函数,以满足你的具体要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值