public Dictionary<string, List<BasicEntity>> ValidateProcess(string excelFile) { var readExcelResp = _excelReader.ReadExcel(excelFile); foreach (var keyValuePair in readExcelResp) { foreach (var basicEntity in keyValuePair.Value) { var validationResult = ExecuteValidate(basicEntity); if (!validationResult.IsValid) { basicEntity.MigrationStatus = MigrationStatus.PreValidationFailed; foreach (var validationResultError in validationResult.Errors) { excelErrorLogService.AddErrorLog(basicEntity.MigrationRowNum.ToString(), validationResultError.ErrorMessage, keyValuePair.Key); } } } if (keyValuePair.Value.Any()) { var verifyDuplicate = VerifyDuplicate(keyValuePair.Value,keyValuePair.Key); if (verifyDuplicate.Any()) { var type = typeof(IValidator<>).MakeGenericType(keyValuePair.Value[0].GetType()); var validator = provider.GetService(type) ; if (validator != null) { var methodInfo = validator.GetType().GetMethod("DuplicateHandler", new[] {verifyDuplicate.GetType() }); methodInfo?.Invoke(validator, new object?[] { verifyDuplicate }); } } } } return readExcelResp; } public List<BasicEntity> VerifyDuplicate(List<BasicEntity> checkList, String sheetName) { var verifySet = new HashSet<string>(); var sameList = new List<BasicEntity>(); var identity = checkList[0].GetIdentity(); if (!string.IsNullOrEmpty(identity)) { var fields = identity.Split(""); foreach (var basicEntity in checkList) { List<string> fieldsValue = new(); foreach (var field in fields) { fieldsValue.Add(basicEntity.GetType() .GetProperty(field, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance).GetValue(basicEntity) ?.ToString()); } var values = string.Join("", fieldsValue); if (verifySet.Contains(values)) { basicEntity.MigrationStatus = MigrationStatus.PreValidationFailed; sameList.Add(basicEntity); _excelErrorLogService.AddErrorLog(basicEntity.MigrationRowNum.ToString(), $"Fields {identity} values repetition", sheetName); } else { verifySet.Add(values); } } } return sameList; } 优化这段代码
时间: 2024-03-29 16:40:34 浏览: 115
这段代码的优化需要结合实际业务场景和需求,以下是一些可能的优化建议:
1. 提取方法:可以将一些功能类似或者重复使用的代码片段提取出来,封装成方法,提高代码的重用性和可读性。比如可以将 VerifyDuplicate 方法提取出来,作为一个独立的方法。
2. 减少嵌套:可以尝试减少嵌套层数,提高代码的可读性。比如可以将 foreach 循环中的部分代码提取出来,作为一个独立的方法。
3. 异常处理:在代码中需要考虑异常情况的处理。比如在调用 ExecuteValidate 和 VerifyDuplicate 方法时,需要对可能出现的异常情况进行捕获和处理。
4. 代码简化:可以尝试简化代码,减少不必要的复杂度。比如在 VerifyDuplicate 方法中,可以使用 Linq 表达式来简化代码。
5. 代码可测试性:在编写代码时,需要考虑代码的可测试性。可以将某些方法的参数提取出来,作为方法的输入参数,这样可以方便地进行单元测试。
6. 代码风格:在编写代码时,需要遵守一定的代码风格,使代码看起来更加整洁和易读。比如可以使用空格和缩进来分隔代码块,或者使用注释来解释代码的作用和用途。
相关问题
public Resjson upload(@RequestParam("file") MultipartFile file) { Resjson res = new Resjson(); List<Map<String, Object>> list = new ArrayList<>(); try { InputStream inputStream = file.getInputStream(); if (file != null) { ExcelReader excelReader = ExcelUtil.getReader(inputStream); List<List<Object>> read = excelReader.read(1, excelReader.getRowCount()); for (List<Object> objects : read) { if (objects.get(0) != null && !objects.get(0).equals("")) { Map<String, Object> map = new HashMap<>(); map.put("id", IdUtil.fastUUID()); map.put("pcbh", objects.get(0).toString()); map.put("fbbh", objects.get(1).toString()); map.put("bh", objects.get(2).toString()); map.put("approveType", objects.get(3).toString()); map.put("rank", objects.get(4).toString()); map.put("result_type", objects.get(5).toString()); map.put("error_type", objects.get(6).toString()); map.put("pass_reason", objects.get(7).toString()); map.put("zbtzsTime", objects.get(8).toString()); map.put("company", objects.get(9).toString()); map.put("price", objects.get(10).toString()); map.put("fwPrice", objects.get(11).toString()); list.add(map); } } excelReader.close(); inputStream.close(); /* tLxsecondFirstPlanService.delRankByPcbh(list.get(0).get("pcbh").toString()); tLxsecondFirstPlanService.saveAllRank(list);*/ res.setCode(ResultCode.SUCCESS.getCode()); res.setMsg("上传成功!"); } } catch (Exception e) { res.setCode(ResultCode.BUS_EXCEPTION.getCode()); res.setMsg("上传异常!"); } return res; }解析一下代码
这段代码是一个上传文件的方法。它接受一个MultipartFile类型的参数file,表示要上传的文件。方法首先创建了一个Resjson对象res和一个空的List<Map<String, Object>>对象list。
然后,它通过file.getInputStream()获取文件的输入流,并判断file不为null。接着,使用ExcelUtil工具类创建一个ExcelReader对象excelReader,并使用excelReader.read()方法读取文件中的数据,将每行数据封装为一个Map对象,然后将Map对象添加到list中。读取完成后,关闭excelReader和inputStream。
最后,将上传成功的状态码和消息设置到res对象中,并通过return语句返回res对象。
如果在文件读取或其他操作中发生异常,则会捕获异常并将错误状态码和消息设置到res对象中,然后返回res对象。
注释部分是一些被注释掉的代码,可能是用于删除和保存排名数据的操作。
public static List<Object> readExcelToList(MultipartFile file) throws IOException { List<Object> list = new ArrayList<>(); InputStream inputStream = file.getInputStream(); ExcelReader excelReader = EasyExcel.read(inputStream, new AnalysisEventListener<Object>() { @Override public void invoke(Object data, AnalysisContext context) { list.add(data); } @Override public void doAfterAllAnalysed(AnalysisContext context) { // 解析结束销毁不用的资源 try { context.readWorkbookHolder().getInputStream().close(); } catch (IOException e) { e.printStackTrace(); } } }).build(); excelReader.read(new Sheet(1, 1, Object.class)); return list; } 方法中'Sheet' 为 abstract;无法实例化
您好,这是因为Sheet类是EasyExcel库中的抽象类,不能直接实例化。您需要使用它的子类来创建Sheet对象。例如,如果您要读取第一个Sheet的所有行和列,并将它们作为Object类型添加到List中,可以使用以下代码:
```java
public static List<Object> readExcelToList(MultipartFile file) throws IOException {
List<Object> list = new ArrayList<>();
InputStream inputStream = file.getInputStream();
ExcelReader excelReader = EasyExcel.read(inputStream, new AnalysisEventListener<Object>() {
@Override
public void invoke(Object data, AnalysisContext context) {
list.add(data);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 解析结束销毁不用的资源
try {
context.readWorkbookHolder().getInputStream().close();
} catch (IOException e) {
e.printStackTrace();
}
}
}).build();
// 读取第一个Sheet的所有行和列,并将它们作为Object类型添加到List中
excelReader.read(new Sheet(1, 1, Object.class));
return list;
}
```
在上面的代码中,我们使用Sheet的子类Sheet.Builder来创建Sheet对象,并指定要读取的Sheet的索引(从1开始),第一行的索引(从1开始),以及要读取的对象类型。然后,将Sheet对象传递给ExcelReader的read()方法,以开始读取Excel文件。
阅读全文