news 2026/3/19 17:19:41

Excel文件解析与数据库存储方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Excel文件解析与数据库存储方案

1.系统现有的文件上传和下载是没有问题的,目前的需求就是将上传的文件进行解析并存入数据库中;

2.上传的文件类型目前都是XLSX类型,需要书写文件解析工具类,用来获取数据;

2.相关的数据库表字段并没有创建,根据上传文件不同创建不同数据库表进行存储文件数据;

3.不同类型的文件Service层需要根据业务需求进行控制,再调用SqlSession来操作数据库(写入数据)也就是增加/修改,删除操作已经存在需要测试是否有效;

文件解析与存储方案设计

文件解析工具类实现XLSX文件解析可使用Apache POI库,创建通用解析工具类处理不同文件类型的数据提取。示例工具类框架如下:

public class ExcelParserUtil { public static List<Map<String, Object>> parseXLSX(MultipartFile file) throws IOException { List<Map<String, Object>> dataList = new ArrayList<>(); try (XSSFWorkbook workbook = new XSSFWorkbook(file.getInputStream())) { XSSFSheet sheet = workbook.getSheetAt(0); // 读取表头作为字段名 XSSFRow headerRow = sheet.getRow(0); // 遍历数据行 for (int i = 1; i <= sheet.getLastRowNum(); i++) { Map<String, Object> rowData = new HashMap<>(); XSSFRow row = sheet.getRow(i); // 单元格数据处理逻辑 for (int j = 0; j < headerRow.getLastCellNum(); j++) { String fieldName = headerRow.getCell(j).getStringCellValue(); rowData.put(fieldName, row.getCell(j)); } dataList.add(rowData); } } return dataList; } }

动态表结构管理

表结构自动生成策略根据XLSX文件表头动态创建表结构,建议采用以下方式:

public void createTableFromExcel(String tableName, List<String> columnHeaders) { StringBuilder sql = new StringBuilder("CREATE TABLE IF NOT EXISTS ") .append(tableName).append(" (id INT AUTO_INCREMENT PRIMARY KEY, "); for (String header : columnHeaders) { sql.append(header.replaceAll("\\s+", "_")).append(" VARCHAR(255), "); } sql.deleteCharAt(sql.length()-2).append(")"); sqlSession.update("DynamicTableMapper.createTable", sql.toString()); }

业务层处理逻辑

多文件类型路由控制Service层通过文件特征(如文件名前缀)进行业务路由:

@Service public class FileProcessingService { @Autowired private SqlSession sqlSession; public void processFile(MultipartFile file) { String fileName = file.getOriginalFilename(); if (fileName.startsWith("ORDER_")) { processOrderFile(file); } else if (fileName.startsWith("INVENTORY_")) { processInventoryFile(file); } } private void processOrderFile(MultipartFile file) { // 订单业务特殊处理逻辑 List<Map<String, Object>> data = ExcelParserUtil.parseXLSX(file); sqlSession.insert("OrderMapper.batchInsert", data); } }

数据库操作验证

现有删除功能测试方案编写单元测试验证删除操作:

@Test public void testDeleteOperation() { Map<String, Object> params = new HashMap<>(); params.put("tableName", "test_table"); params.put("id", 1); int affectedRows = sqlSession.delete("CommonMapper.deleteById", params); assertEquals(1, affectedRows); }

类型安全处理建议

数据转换最佳实践在解析工具类中增加类型转换处理:

private Object convertCellValue(Cell cell) { switch (cell.getCellType()) { case NUMERIC: return cell.getNumericCellValue(); case STRING: return cell.getStringCellValue(); case BOOLEAN: return cell.getBooleanCellValue(); default: return null; } }

事务管理配置

批量操作事务控制在Service方法添加事务注解保证数据一致性:

@Transactional public void batchInsertData(String tableName, List<Map<String, Object>> data) { for (Map<String, Object> record : data) { record.put("tableName", tableName); sqlSession.insert("DynamicTableMapper.insert", record); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/19 17:57:15

精通Maestro移动UI自动化:实战无障碍测试与高级技巧解析

精通Maestro移动UI自动化&#xff1a;实战无障碍测试与高级技巧解析 【免费下载链接】maestro Painless Mobile UI Automation 项目地址: https://gitcode.com/gh_mirrors/ma/maestro 在移动应用开发日益复杂的今天&#xff0c;确保应用界面对所有用户友好且可访问已成为…

作者头像 李华
网站建设 2026/3/15 0:01:29

Golang棋牌游戏后端实战

在实时互动类游戏开发中&#xff0c;棋牌游戏因其强状态依赖、高频率交互和严格公平性要求&#xff0c;成为后端系统设计的“试金石”。而 Go 语言&#xff08;Golang&#xff09;凭借其轻量级并发模型、高效网络处理能力和简洁的工程结构&#xff0c;成为构建高性能棋牌后端的…

作者头像 李华
网站建设 2026/3/19 12:27:16

AI Agent构建实战:v0s提示词库与Latitude平台的无缝集成

AI Agent构建实战&#xff1a;v0s提示词库与Latitude平台的无缝集成 【免费下载链接】v0-system-prompts-models-and-tools 项目地址: https://gitcode.com/GitHub_Trending/v0s/v0-system-prompts-models-and-tools 还在为AI Agent开发中的复杂配置而烦恼&#xff1f;…

作者头像 李华
网站建设 2026/3/14 4:02:51

【自动控制入门1B】从零搭建混合控制系统:基于抗积分饱和PID的输入限制直线运动物体位置控制仿真程序

目录 引言 python 仿真程序 完整程序 引言 本文分享【自动控制入门1A】从零搭建混合控制系统:基于抗积分饱和PID的输入限制直线运动物体位置控制文章里仿真使用的程序,包括从零搭建的python仿真程序和用于对比的matlab/simulink仿真模型,其中python程序仅用到常用数据处理库…

作者头像 李华