写了一个上传excel到解析到数据库的通用类,只能作为参考

写了一个上传excel到解析到数据库的通用类,只能作为参考


先在本文件中判断有没有规定的列重复的,然后判断数据库有没有重复的,没有就insert 有就提示,次例为自定义orm框架中的一个写法

// An highlighted block
 protected String saveList(RestTemplate restTemplate, String pass, String addr, Integer port, Class<?> type, MultipartFile multipartFile) throws Exception {
        String moduleandDate = RedisUtil.getTable_DsModule(addr, port, pass, type);
        List<String> dbList = Arrays.asList(moduleandDate.split(","));
        String module = dbList.get(0);
        String datasouce = dbList.get(1);
        SaveOrUpdateResult saveOrUpdateResult = new SaveOrUpdateResult();
        RowCheck rowCheck = new RowCheck();
        if (multipartFile == null || multipartFile.getSize() == 0) {
            rowCheck.setCheck(false);
            saveOrUpdateResult.setData(rowCheck);
            rowCheck.getRowMessageList().add("文件上传错误,重新上传");
            return objectMapper.writeValueAsString(saveOrUpdateResult);
        }
        String filename = multipartFile.getOriginalFilename();
        if (!(filename.endsWith(".xls") || filename.endsWith(".xlsx"))) {
            rowCheck.setCheck(false);
            saveOrUpdateResult.setData(rowCheck);
            rowCheck.getRowMessageList().add("文件上传格式错误,请重新上传");
            return objectMapper.writeValueAsString(saveOrUpdateResult);
        }
        List<Map<String, Object>> accountMapList = new ArrayList<>();
        List<Object> objectList = new ArrayList<>();
        if (filename.endsWith(".xls")) {
            InputStream inputStream = multipartFile.getInputStream();
            HSSFWorkbook workbook = new HSSFWorkbook(inputStream);
            for(int s = 0; s <workbook.getNumberOfSheets(); s++){
                HSSFSheet sheet = workbook.getSheetAt(s);
                if(sheet.getLastRowNum()!=0){
                    String tablename = sheet.getSheetName();

                    int lastRowNum = sheet.getLastRowNum();//:读取总行数
                    //从第二行开始,第一行为标题
                    HSSFRow fieldName = sheet.getRow(0);//第一行的所有信息  隐藏行的字段信息
                    HashMap<Integer,Object> fieldNameset = new HashMap<>();
                    // 获取所有的字段 获取要去去重的列
                    List<Map<Integer, String>> ints = new ArrayList<Map<Integer, String>>();
                    for (int i = 0; i < fieldName.getPhysicalNumberOfCells(); i++) {
                        fieldName.getCell(i).getStringCellValue();  //各列的字段名称
                        List<String> logicIdFieldList = addLogicalJudgmentList(); //获取要去重的字段
                        if (logicIdFieldList != null && logicIdFieldList.size() > 0) {
//                        吧要去重的字段放到一个listmap中
                            for (int c = 0; c < logicIdFieldList.size(); c++) {
                                if (fieldName.getCell(i).getStringCellValue().equals(logicIdFieldList.get(c))) {
                                    Map<Integer, String> map = new HashMap<>();
                                    map.put(i, fieldName.getCell(i).getStringCellValue());
                                    ints.add(map);
                                }
                            }
                        }
//                    存入所有的字段名
                        fieldNameset.put(i,fieldName.getCell(i).getStringCellValue());
                    }

                    //从第二行开始,第一行为标题
                    for (int rowNum = 2; rowNum <= sheet.getLastRowNum(); rowNum++) {
                        HSSFRow row = sheet.getRow(rowNum);//第一行的所有信息
                        if (row != null) {
                            // 获取列数
                            row.getPhysicalNumberOfCells();
                            Object object = type.newInstance();
                            Field field = object.getClass().getDeclaredField("db_id");
                            field.setAccessible(true);
                            field.set(object, IdUtil.genSnowflakeId());
                            Field[] fields = object.getClass().getDeclaredFields();
                            for (int i = 0; i < row.getPhysicalNumberOfCells(); i++) {
                                for (Field fie : fields) {
                                    if ( row.getCell(i)==null){
                                        rowCheck.setCheck(false);
                                        saveOrUpdateResult.setData(rowCheck);
                                        rowNum=rowNum+1;
                                        i=i+1;
                                        rowCheck.getRowMessageList().add("第"+rowNum+"行,第"+i+"列数据为空,请检查");
                                        return objectMapper.writeValueAsString(saveOrUpdateResult);
                                    }
                                    //如果有创建时间就在这加上当前时间
                                    if ("db_createtime".equals(fie.getName())) {
                                        fie.setAccessible(true);
                                        fie.set(object, new Date());
                                    }
                                    if ("db_intime".equals(fie.getName())) {
                                        fie.setAccessible(true);
                                        fie.set(object, new Date());
                                    }
                                    //循环判断要去重的列
                                    for(Map vmap:ints){
                                        Iterator<Integer> it = vmap.keySet().iterator();
                                        while (it.hasNext()) {
                                            Integer value = Integer.valueOf(it.next());
                                            if(value.equals(i)){  //每一行的这列需要进行判断
                                                for(Object objects:objectList){
                                                    Field  ofield = objects.getClass().getDeclaredField(String.valueOf(vmap.get(value)));
                                                    ofield.setAccessible(true);
                                                    if(ofield.get(objects).equals(row.getCell(i).getStringCellValue())){
                                                        rowCheck.setCheck(false);
                                                        saveOrUpdateResult.setData(rowCheck);
                                                        rowNum=rowNum+1;
                                                        i=i+1;
                                                        rowCheck.getRowMessageList().add("第"+rowNum+"行,第"+i+"列数据重复");
                                                        return objectMapper.writeValueAsString(saveOrUpdateResult);
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    //判断如果字段名相等就赋值

                                    Iterator<Integer> fieldNames = fieldNameset.keySet().iterator(); //遍历所有的字段名
                                    while (fieldNames.hasNext()) {
                                        Integer fieldValue = fieldNames.next();

                                        if (fieldNameset.get(fieldValue).equals(fie.getName())) {
                                            row.getCell(fieldValue).setCellType(CellType.STRING);
                                            fie.setAccessible(true);
                                            fie.set(object, row.getCell(fieldValue).getStringCellValue());
                                        }
                                    }
                                }
                            }
                            //判断数据库中是否有这个数据,如果有提醒

                            List<String> logicIdFieldList = addLogicalJudgmentList();
                            if (logicIdFieldList != null && logicIdFieldList.size() > 0) {

                                String sql = RedisUtil.getTable_SelectCount(addr, port, pass, type);
                                for (int i = 0; i < logicIdFieldList.size(); i++) {
                                    String fieldss = logicIdFieldList.get(i);
                                    sql += " and " + fieldss + " = ? ";
                                }
                                Map<String, String> dataMap = new LinkedHashMap<>();

                                for (int i = 0; i < logicIdFieldList.size(); i++) {
                                    Object value = ReflectUtil.getFieldValue(object, logicIdFieldList.get(i));
                                    String name = object.getClass().getDeclaredField(logicIdFieldList.get(i)).getType().getName();
                                    Object types = name.substring(name.lastIndexOf(".") + 1);
                                    //获取字段类型
                                    dataMap.put(i + "_" + types.toString().toLowerCase(), String.valueOf(value));
                                }

                                String url = "";
                                ResponseEntity<CommonResult> responseEntity = restTemplate.getForEntity(url, CommonResult.class);
                                CommonResult commonResult = responseEntity.getBody();
                                List<Map> results = new ArrayList<>();
                                if (commonResult.getData() instanceof ArrayList<?>) {
                                    for (Object o : (List<?>) commonResult.getData()) {
                                        results.add(Map.class.cast(o));
                                    }
                                    results.get(0).get("count");
                                }
                                if ((int) results.get(0).get("count") > 0) {
                                    rowCheck.getRowMessageList().add("逻辑主键重复");
                                    rowCheck.setCheck(false);
                                    saveOrUpdateResult.setData(rowCheck);
                                    return objectMapper.writeValueAsString(saveOrUpdateResult);
                                }
                            }

                            //吧entity转换成map
                            objectList.add(object); //redis存入格式
                            Map<String, Object> accountMap = RedisUtil.getInsertParamMap(addr, port, pass, object);
                            accountMapList.add(accountMap);
                        }
                    }

                }
            }

        } else {
            InputStream inputStream = multipartFile.getInputStream();
            XSSFWorkbook Workbook = new XSSFWorkbook(inputStream);
//                遍历所有的sheet
            for (int s = 0; s < Workbook.getNumberOfSheets(); s++) {
                XSSFSheet sheet = Workbook.getSheetAt(s);
                if(sheet.getLastRowNum()!=0){
                    String tablename = sheet.getSheetName();

                    XSSFRow fieldName = sheet.getRow(0);//第一行的所有信息
                    HashMap<Integer,Object> fieldNameset = new HashMap<>();
                    // 获取所有的字段 获取要去去重的列
                    List<Map<Integer, String>> ints = new ArrayList<Map<Integer, String>>();
                    for (int i = 0; i < fieldName.getPhysicalNumberOfCells(); i++) {
                        fieldName.getCell(i).getStringCellValue();  //各列的字段名称
                        List<String> logicIdFieldList = addLogicalJudgmentList(); //获取要去重的字段
                        if (logicIdFieldList != null && logicIdFieldList.size() > 0) {
//                        吧要去重的字段放到一个listmap中
                            for (int c = 0; c < logicIdFieldList.size(); c++) {
                                if (fieldName.getCell(i).getStringCellValue().equals(logicIdFieldList.get(c))) {
                                    Map<Integer, String> map = new HashMap<>();
                                    map.put(i, fieldName.getCell(i).getStringCellValue());
                                    ints.add(map);
                                }
                            }
                        }
//                    存入所有的字段名
                        fieldNameset.put(i,fieldName.getCell(i).getStringCellValue());
                    }

                    //从第二行开始,第一行为标题
                    for (int rowNum = 2; rowNum <= sheet.getLastRowNum(); rowNum++) {
                        XSSFRow row = sheet.getRow(rowNum);//第一行的所有信息
                        if (row != null) {
                            // 获取列数
                            row.getPhysicalNumberOfCells();
                            Object object = type.newInstance();
                            Field field = object.getClass().getDeclaredField("db_id");
                            field.setAccessible(true);
                            field.set(object, IdUtil.genSnowflakeId());
                            Field[] fields = object.getClass().getDeclaredFields();
                            for (int i = 0; i < row.getPhysicalNumberOfCells(); i++) {
                                for (Field fie : fields) {
                                    if ( row.getCell(i)==null){
                                        rowCheck.setCheck(false);
                                        saveOrUpdateResult.setData(rowCheck);
                                        rowNum=rowNum+1;
                                        i=i+1;
                                        rowCheck.getRowMessageList().add("第"+rowNum+"行,第"+i+"列数据为空,请检查");
                                        return objectMapper.writeValueAsString(saveOrUpdateResult);
                                    }
                                    //如果有创建时间就在这加上当前时间
                                    if ("db_createtime".equals(fie.getName())) {
                                        fie.setAccessible(true);
                                        fie.set(object, new Date());
                                    }
                                    if ("db_intime".equals(fie.getName())) {
                                        fie.setAccessible(true);
                                        fie.set(object, new Date());
                                    }
                                    //循环判断要去重的列
                                        for(Map vmap:ints){
                                            Iterator<Integer> it = vmap.keySet().iterator();
                                            while (it.hasNext()) {
                                                Integer value = Integer.valueOf(it.next());
                                                if(value.equals(i)){  //每一行的这列需要进行判断
                                                    for(Object objects:objectList){
                                                        Field  ofield = objects.getClass().getDeclaredField(String.valueOf(vmap.get(value)));
                                                        ofield.setAccessible(true);
                                                        if(ofield.get(objects).equals(getCellValue(row.getCell(i)))){
                                                            rowCheck.setCheck(false);
                                                            saveOrUpdateResult.setData(rowCheck);
                                                            rowNum=rowNum+1;
                                                            i=i+1;
                                                            rowCheck.getRowMessageList().add("第"+rowNum+"行,第"+i+"列数据重复");
                                                            return objectMapper.writeValueAsString(saveOrUpdateResult);
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    //判断如果字段名相等就赋值

                                    Iterator<Integer> fieldNames = fieldNameset.keySet().iterator(); //遍历所有的字段名
                                    while (fieldNames.hasNext()) {
                                        Integer fieldValue = fieldNames.next();

                                        if (fieldNameset.get(fieldValue).equals(fie.getName())) {
                                            row.getCell(fieldValue).setCellType(CellType.STRING);
                                            fie.setAccessible(true);
                                            fie.set(object, getCellValue(row.getCell(fieldValue)));
                                        }
                                    }
                                }
                            }
                            //判断数据库中是否有这个数据,如果有提醒

                            List<String> logicIdFieldList = addLogicalJudgmentList();
                            if (logicIdFieldList != null && logicIdFieldList.size() > 0) {

                                String sql = RedisUtil.getTable_SelectCount(addr, port, pass, type);
                                for (int i = 0; i < logicIdFieldList.size(); i++) {
                                    String fieldss = logicIdFieldList.get(i);
                                    sql += " and " + fieldss + " = ? ";
                                }
                                Map<String, String> dataMap = new LinkedHashMap<>();

                                for (int i = 0; i < logicIdFieldList.size(); i++) {
                                    Object value = ReflectUtil.getFieldValue(object, logicIdFieldList.get(i));
                                    String name = object.getClass().getDeclaredField(logicIdFieldList.get(i)).getType().getName();
                                    Object types = name.substring(name.lastIndexOf(".") + 1);
                                    //获取字段类型
                                    dataMap.put(i + "_" + types.toString().toLowerCase(), String.valueOf(value));
                                }

                                String url = "";
                                ResponseEntity<CommonResult> responseEntity = restTemplate.getForEntity(url, CommonResult.class);
                                CommonResult commonResult = responseEntity.getBody();
                                List<Map> results = new ArrayList<>();
                                if (commonResult.getData() instanceof ArrayList<?>) {
                                    for (Object o : (List<?>) commonResult.getData()) {
                                        results.add(Map.class.cast(o));
                                    }
                                    results.get(0).get("count");
                                }
                                if ((int) results.get(0).get("count") > 0) {
                                    rowCheck.getRowMessageList().add("逻辑主键重复");
                                    rowCheck.setCheck(false);
                                    saveOrUpdateResult.setData(rowCheck);
                                    return objectMapper.writeValueAsString(saveOrUpdateResult);
                                }
                            }

                            //吧entity转换成map
                            objectList.add(object); //redis存入格式
                            Map<String, Object> accountMap = RedisUtil.getInsertParamMap(addr, port, pass, object);
                            accountMapList.add(accountMap);
                        }
                    }

                }
                }

        }


        //在这添加
        String sql = RedisUtil.getTable_Insert(addr, port, pass, type);
        String inserturl = CURDURL + "/curd/ijsondata/updateSql?module=" + module + "&datasource=" + datasouce +
                "&sql=" + sql + "&jsonData=" + URLEncoder.encode(objectMapper.writeValueAsString(accountMapList), "utf-8");
        ResponseEntity<CommonResult> cresponseEntity = restTemplate.getForEntity(inserturl, CommonResult.class);
        CommonResult commonResult = cresponseEntity.getBody();
        if (commonResult.isSuccess()) {
            RedisUtil.setTableDatas(addr, port, pass, objectList);
            return objectMapper.writeValueAsString(saveOrUpdateResult);
        } else {
            saveOrUpdateResult.setSuccess(false);
            saveOrUpdateResult.setMessage(commonResult.getMessage());
            return objectMapper.writeValueAsString(saveOrUpdateResult);
        }
        //return null;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值