当前位置: 首页 > news >正文

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导入功能具有以下特点:

  1. 完整的处理流程:文件上传 → 数据解析 → 格式转换 → 批量入库 → 业务处理
  2. 健壮的异常处理:事务管理、数据校验、错误记录
  3. 良好的性能优化:批量操作、分页处理、异步调用
  4. 清晰的架构设计:职责分离、易于维护和扩展

这套解决方案在银行系统中得到了良好应用,为表外业务数据处理提供了可靠的技术支撑。

http://www.dtcms.com/a/388942.html

相关文章:

  • Chromium 138 编译指南 macOS 篇:构建配置与编译优化(五)
  • 基于Java与Vue的MES生产制造管理系统,实现生产流程数字化管控,涵盖计划排程、质量追溯、设备监控等功能模块,提供完整源码支持二次开发,助力智能制造升级
  • 人工智能基础:从感知机到神经网络核心知识整合​
  • 电子制造设备中螺杆支撑座如何保障精度与质量控制?
  • 东莞精密制造工厂6人共用一台服务器做SolidWorks设计
  • 智能科学与技术专业毕业设计选题推荐:计算机视觉与自然语言处理
  • 基于STM32F103C8T6与HC-08蓝牙模块实现手机连接方案
  • OpenCV 4.12.0源码解析:核心模块原理与实战应用
  • PyTorch 与 TensorFlow 的深度对比分析
  • 怀旧电玩游戏ROM合集 50T模拟器游戏资源分享
  • MacCAD2019.dmg 安装包使用教程|Mac电脑安装CAD2019全流程
  • IP失效,溯源无门:微隔离如何破局容器环境下“黑域名”攻击溯源难题!
  • 基于dify做聊天查询的智能体(一)
  • 关于 C 语言 编程语言常见问题及技术要点的说明​
  • Chromium 138 编译指南 macOS 篇:高级优化与调试技术(六)
  • word:快捷键:Delete、BACKSPACE、INSERT键?
  • PromptPilot 产品发布:火山引擎助力AI提示词优化的新利器
  • rust编写web服务11-原生Socket与TCP通信
  • DevOps平台建设 - 总体设计文档驱动下的全流程自动化与创新实践
  • Spring Cloud中配置多个 Kafka 实例的示例
  • 从零开始手写机器学习框架:我的深度学习之旅——核心原理解密与手写实现
  • 有方向的微小目标检测
  • 【office】如何让word每一章都单独成一页
  • git安装教程+IDEA集成+客户端命令全面讲解
  • rsync带账号密码
  • rust语言项目实战:生成双色球、大乐透所有玩法的所有数字组合(逐行注释)
  • 远程配置服务器 ubuntu22.04 里的 docker 的x11
  • rust编写web服务03-错误处理与响应封装
  • Docker基础篇07:Docker容器数据卷
  • WPF 拖拽(Drag Drop)完全指南:从入门到精通