excel文件导入+存储过程导入表到业务表
前言
本文将详细介绍如何使用Spring Boot实现一个完整的Excel导入功能,包括文件上传、数据解析、格式转换、批量入库和存储过程调用等核心环节。
业务背景
业务数据通常以Excel格式提供,需要将其导入到系统中进行后续处理。整个流程涉及数据校验、格式转换、批量存储和业务处理等多个步骤。
核心功能分析
1. Controller层 - Excel导入入口
@PostMapping("/import-excel")
@Operation(summary = "从Excel导入到表外业务列表")
@Parameters({@Parameter(name = "file", description = "Excel 文件", required = true),
})
public CommonResult<ExcelLedgerOutImportRespVO> importExcel(@RequestParam("file") MultipartFile file) throws IOException {// 1. 读取Excel数据List<ExcelLedgerOutImportExcelVO> list = ExcelUtils.read(file, ExcelLedgerOutImportExcelVO.class);// 2. 获取文件名和生成批次号String originalFilename = file.getOriginalFilename();Long batchId = excelLedgerOutService.genBatchId(originalFilename);// 3. 数据转换List<ExcelLedgerOutDO> insertList = excelLedgerOutService.convertExcelList(list, originalFilename, batchId);// 4. 数据入库excelLedgerOutService.saveImportData(insertList);// 5. 调用存储过程进行业务处理ExcelLedgerOutTurnVo excelLedgerOutTurnVo = ExcelLedgerOutTurnVo.builder().build();excelLedgerOutTurnVo.setBatchNo(batchId);excelLedgerOutTurnVo.setCode(4);// 转储方法excelLedgerOutService.turnData(excelLedgerOutTurnVo);return success(ExcelLedgerOutImportRespVO.builder().build().setBatchId(batchId));
}
2. Service层核心方法
/*** 插入导入批次记录* 获取导入批次号* @param originalFilename* @return*/Long genBatchId(String originalFilename);/*** 数据转换 Excel* @param list* @param originalFilename* @param batchId* @return*/List<ExcelLedgerOutDO> convertExcelList(List<ExcelLedgerOutImportExcelVO> list, String originalFilename, Long batchId);/*** 数据入库* @param insertList*/void saveImportData(List<ExcelLedgerOutDO> insertList);
2.1 生成批次号并记录导入日志
@Override
public Long genBatchId(String originalFilename){// 使用时间戳作为批次号,确保唯一性Long batchId = System.currentTimeMillis();// 记录导入批次信息ExcelImportFileLogDO excelImportFileLog = ExcelImportFileLogDO.builder().fileName(originalFilename).bizType(20) // 业务类型标识.batchNo(batchId).build();excelImportFileLogMapper.insert(excelImportFileLog);return batchId;
}
2.2 数据转换处理
时间转换的工具类跳转Java 日期字符串万能解析工具类(支持多种日期格式智能转换)_java字符串日期解析工具-CSDN博客
@Override
public List<ExcelLedgerOutDO> convertExcelList(List<ExcelLedgerOutImportExcelVO> read, String originalFilename, Long batchId) {List<ExcelLedgerOutDO> insertList = new ArrayList<>();for (ExcelLedgerOutImportExcelVO excelVO : read) {// 基础属性转换ExcelLedgerOutDO excelDO = BeanUtils.toBean(excelVO, ExcelLedgerOutDO.class);// 日期字段格式转换excelDO.setKline(DateStringSwitchUtils.INSTANCE.toLocalDateTimeString(excelVO.getKline())); // 某列数据的日期转换// 数值字段格式清理excelDO.setMline(cleanNumericValue(excelVO.getMline())); // 设置批次信息和状态excelDO.setBatchNo(batchId);excelDO.setFileName(originalFilename);excelDO.setStatus(3); // 导入状态标识insertList.add(excelDO);}return insertList;
}// 数值字段清理工具方法
private String cleanNumericValue(String value) {if (StringUtils.isEmpty(value)) {return "0.00";}return value.replace("‰", "").replace("%", "").replace(",", "");
}
2.3 数据入库和事务管理
@Transactional(rollbackFor = Exception.class)
public void saveImportData(List<ExcelLedgerOutDO> insertList){// 批量插入提高性能excelLedgerOutMapper.insertBatch(insertList);
}
3. 存储过程调用
// Mapper接口定义
@Select("CALL process_excel_ledger_out(#{code}, #{batchNo}, #{dataId})")
void process(@Param("code") Integer code,@Param("batchNo") Long batchNo,@Param("dataId") Long dataId);// Service层调用
public void turnData(ExcelLedgerOutTurnVo vo) {excelLedgerOutMapper.process(vo.getCode(), vo.getBatchNo(), vo.getDataId());
}
技术亮点解析
1. 批次号生成策略
Long batchId = System.currentTimeMillis();
优势:
- 简单高效,保证唯一性
- 时间有序,便于查询和管理
- 无需额外的序列生成器
2. 数据格式转换处理
2.1 日期格式转换
DateStringSwitchUtils.INSTANCE.toLocalDateTimeString(excelVO.getKline())
2.2 数值格式清理
value.replace("‰", "").replace("%", "").replace(",", "")
处理的特殊情况:
- 千分号(‰)、百分号(%)符号移除
- 千位分隔符(,)移除
- 空值处理为默认值"0.00"
3. 批量操作优化
@Transactional(rollbackFor = Exception.class)
public void saveImportData(List<ExcelLedgerOutDO> insertList){
excelLedgerOutMapper.insertBatch(insertList);
}
优势:
- 使用事务确保数据一致性
- 批量插入提高导入性能
- 异常回滚保证数据完整性
4. 存储过程集成
@Select("CALL process_excel_ledger_out(#{code}, #{batchNo}, #{dataId})")
void process(@Param("code") Integer code,
@Param("batchNo") Long batchNo,
@Param("dataId") Long dataId);
优势:
- 复杂业务逻辑在数据库层处理
- 减少网络传输次数
- 提高处理效率
总结
本文介绍的Excel导入功能具有以下特点:
- 完整的处理流程:文件上传 → 数据解析 → 格式转换 → 批量入库 → 业务处理
- 健壮的异常处理:事务管理、数据校验、错误记录
- 良好的性能优化:批量操作、分页处理、异步调用
- 清晰的架构设计:职责分离、易于维护和扩展
这套解决方案在银行系统中得到了良好应用,为表外业务数据处理提供了可靠的技术支撑。