feat(xispeak): 新增Excel校验接口,只校验不保存到数据库

- JeecgController 新增 checkExcelByEasyExcel 基类方法,batchHandler 传 null 跳过入库
- ExcelImportListener 支持 batchHandler 为 null 时不攒 batch 内存
- BgXiSpeakController 新增 /checkExcelByEasyExcel 接口

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
wsm
2026-06-30 10:05:13 +08:00
co-authored by Claude Opus 4.7
parent d59adeeaf7
commit 16343d2e99
3 changed files with 51 additions and 7 deletions
@@ -237,6 +237,40 @@ public class JeecgController<T, S extends IService<T>> {
}
}
/**
* 通过EasyExcel校验数据,只返回校验结果,不保存到数据库
*/
protected Result<?> checkExcelByEasyExcel(HttpServletRequest request, Class<T> clazz) {
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
MultipartFile file = fileMap.values().stream().findFirst().orElse(null);
if (file == null) {
return Result.error("未找到上传文件!");
}
try (InputStream inputStream = file.getInputStream()) {
long start = System.currentTimeMillis();
List<ExcelAnnotationUtils.ValidationError> errors = new ArrayList<>();
int total = ExcelAnnotationUtils.read(
inputStream,
clazz,
null,
BATCH_NUM,
errors::addAll,
dictQuery());
log.info("【EasyExcel校验】校验完成, 数据行数: {}, 耗时: {}毫秒", total, System.currentTimeMillis() - start);
if (!errors.isEmpty()) {
for (ExcelAnnotationUtils.ValidationError err : errors) {
log.warn("【EasyExcel校验】校验失败, 行号: {}, 错误: {}", err.row(), err.messages());
}
return Result.error("文件校验不通过: 存在" + errors.size() + "行数据校验不通过,请修改后重新导入", errors);
}
return Result.ok("文件校验通过!数据行数:" + total);
} catch (IOException e) {
log.error("【EasyExcel校验】文件读取失败", e);
return Result.error("文件校验失败:" + e.getMessage());
}
}
/**
* 通过excel导入数据
*