EasyExcel导入一对多
时间: 2025-05-10 08:40:29 浏览: 23
### EasyExcel 实现一对多数据导入
在实际开发场景中,`EasyExcel` 是阿里巴巴开源的一个用于处理 Excel 文件的轻量级框架。它支持高效读写大文件的能力,并提供了灵活的扩展机制来满足复杂业务需求。
#### 一、核心概念
为了实现一对多的数据导入功能,通常会涉及以下两个部分:
1. **父对象与子对象的关系映射**:通过定义实体类结构,将父子关系绑定到对应的字段上。
2. **自定义转换逻辑**:由于 Excel 的二维表格形式无法直接表达复杂的嵌套关系,因此需要借助 `Converter` 或者其他方式完成数据解析和组装[^1]。
---
#### 二、具体实现步骤
以下是基于 `EasyExcel` 的一对多数据导入的具体代码示例:
##### 1. 定义实体类
假设存在一个订单表(Order),每个订单可以关联多个商品明细(Product)。我们需要分别创建这两个模型并建立联系。
```java
// 父类 - 订单信息
@Data
public class Order {
private String orderId; // 订单编号
@ExcelProperty(value = "客户名称", index = 0)
private String customerName;
// 子列表属性 (需手动填充)
private List<Product> productList;
}
// 子类 - 商品详情
@Data
public class Product {
@ExcelProperty(value = "产品编码", index = 1)
private String productCode;
@ExcelProperty(value = "数量", index = 2)
private Integer quantity;
}
```
注意:上述例子中的 `@ExcelProperty` 注解用来指定列名及其索引位置;而 `productList` 属性则不会被自动注入,因为它是非标准单元格内容的一部分。
---
##### 2. 创建监听器
为了让程序能够识别哪些行属于同一个订单下的不同项次,我们可以通过继承 `AnalysisEventListener<T>` 来捕获每一行记录的变化情况。
```java
public class OneToManyListener extends AnalysisEventListener<Order> {
private Map<String, Order> orderMap = new HashMap<>(); // 缓存当前正在构建的对象
@Override
public void invoke(Order data, AnalysisContext context) {
String currentOrderId = data.getOrderId();
if (!orderMap.containsKey(currentOrderId)) { // 如果该ID尚未初始化,则新增一条主键条目
Order newOrder = new Order();
newOrder.setOrderId(data.getOrderId());
newOrder.setCustomerName(data.getCustomerName());
this.orderMap.put(currentOrderId, newOrder);
}
// 获取对应订单实例并向其追加子项目
Order existingOrder = this.orderMap.get(currentOrderId);
Product newItem = new Product();
newItem.setProductCode(data.getProductCode()); // 假设此处是从data提取出来的额外字段
newItem.setQuantity(data.getQuantity());
if (existingOrder.getProductList() == null){
existingOrder.setProductList(new ArrayList<>());
}
existingOrder.getProductList().add(newItem);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
System.out.println("所有数据已加载完毕!");
// 此处可进一步操作最终结果集this.orderMap.values()
}
}
```
在这个过程中,每当遇到新的订单号时都会新建相应的容器存储起来;而对于重复出现的相同 ID 则只更新它们所含有的细节数组即可。
---
##### 3. 调用 API 进行批量上传
最后一步就是调用官方提供的接口执行整个流程啦!
```java
public static void main(String[] args) throws Exception{
String fileName = "/path/to/your/excel.xlsx";
EasyExcel.read(fileName,new OneToManyListener()).sheet().doRead();
}
```
以上即完成了利用 easyexcel 库来进行简单的“一对一或多”的 excel 表单录入工作流设计.
---
###
阅读全文
相关推荐


















