springboot读取excel一对多
时间: 2025-05-19 18:40:54 浏览: 27
### Spring Boot 中实现 Excel 文件读取并支持一对多关系
在 Spring Boot 应用程序中,可以通过集成第三方库(如 EasyPOI 或 Apache POI)来实现复杂的业务逻辑,比如读取 Excel 文件中的数据并将这些数据映射为实体对象的关系结构。以下是基于 `Spring Boot` 和 `EasyPOI` 的解决方案。
#### 技术栈说明
- **Spring Boot**: 提供快速开发框架。
- **MyBatis-Plus**: 数据持久化层工具,简化数据库操作。
- **EasyPOI**: 高效处理 Excel 导入导出的功能库[^1]。
---
#### 解决方案概述
为了实现 Excel 文件中的一对多关系解析,可以按照以下方式设计:
1. 定义两个实体类分别表示父表和子表的数据模型,并建立关联关系。
2. 使用 `@ExcelEntity` 注解标记字段以便于自动映射 Excel 列到 Java 属性。
3. 编写自定义监听器或处理器,在导入过程中动态构建父子关系。
4. 将最终的结果保存至数据库。
---
#### 示例代码
##### 1. 添加依赖项
在项目的 `pom.xml` 文件中引入必要的依赖包:
```xml
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>4.4.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
```
##### 2. 创建实体类
假设我们有一个订单 (`Order`) 表及其对应的明细记录 (`OrderDetail`) 表,则需要创建如下两个实体类:
###### (a) Order 类
```java
import cn.afterturn.easypoi.excel.annotation.Excel;
public class Order {
@Excel(name = "订单编号", orderNum = "orderCode")
private String code;
@Excel(name = "客户名称", orderNum = "customerName")
private String customerName;
// 子表集合
private List<OrderDetail> details;
// Getter & Setter 方法省略...
}
```
###### (b) OrderDetail 类
```java
import cn.afterturn.easypoi.excel.annotation.Excel;
public class OrderDetail {
@Excel(name = "商品编码", orderNum = "productCode")
private String productCode;
@Excel(name = "数量", orderNum = "quantity")
private Integer quantity;
// Getter & Setter 方法省略...
}
```
##### 3. 自定义导入方法
编写服务端逻辑用于接收上传的 Excel 文件并完成解析工作:
```java
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
@RestController
@RequestMapping("/api/excel")
public class ExcelController {
@PostMapping("/upload")
public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) throws Exception {
if (!file.isEmpty()) {
ImportParams params = new ImportParams();
params.setHeadRows(1); // 设置头部行数
// 调用 EasyPOI 工具进行解析
List<Order> orders = ExcelImportUtil.importExcel(file.getInputStream(), Order.class, params);
// 处理每条记录
processOrders(orders);
return ResponseEntity.ok("成功导入!");
} else {
return ResponseEntity.badRequest().body("未找到文件");
}
}
private void processOrders(List<Order> orders) {
orders.forEach(order -> {
System.out.println("订单号:" + order.getCode());
System.out.println("客户名:" + order.getCustomerName());
// 打印详情列表
order.getDetails().forEach(detail -> {
System.out.println("商品编码:" + detail.getProductCode() + ", 数量:" + detail.getQuantity());
});
});
// TODO: 可在此处调用 DAO/Service 进一步存入数据库
}
}
```
上述代码片段展示了如何利用 `EasyPOI` 来加载 Excel 文档的内容,并将其转换为目标类型的实例数组。同时提供了简单的控制台打印语句验证结果正确性^。
---
#### 注意事项
当涉及复杂场景时,可能还需要额外考虑以下几个方面:
- 如果存在嵌套层次更深的情况,建议扩展领域驱动设计理念,进一步拆分职责边界;
- 对大数据集的支持优化可通过流式 API 实现逐批加载减少内存占用[^3]^;
- 错误校验机制应尽早介入流程以提升用户体验度。
---
阅读全文
相关推荐


















