easyexcel 导出list字段
时间: 2025-01-27 18:32:01 浏览: 103
### 如何使用 EasyExcel 导出包含 List 字段的数据
为了导出包含 `List` 类型字段的数据,可以通过自定义转换逻辑来处理这些列表项。下面是一个完整的解决方案。
#### 1. 引入依赖
确保已经在项目的 pom.xml 文件中引入了 EasyExcel 的 Maven 依赖[^5]:
```xml
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.3.2</version>
</dependency>
```
#### 2. 创建实体类
假设有一个名为 `OrderDetail` 的实体类用于表示订单详情表头信息以及其中的明细条目集合:
```java
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
@Data
public class OrderDetail {
@ExcelProperty("订单编号")
private String orderNo;
@ExcelProperty("客户名称")
private String customerName;
// 明细条目的列表属性
private List<OrderItem> items;
}
```
对于明细条目对象 `OrderItem`, 定义如下:
```java
import com.alibaba.excel.annotation.ExcelProperty;
import java.math.BigDecimal;
import lombok.Data;
@Data
public class OrderItem {
@ExcelProperty("商品ID")
private Long productId;
@ExcelProperty("数量")
private Integer quantity;
@ExcelProperty("单价 (元)")
private BigDecimal unitPrice;
}
```
#### 3. 实现写操作方法
编写服务层的方法来进行 Excel 数据写出动作,在此过程中需要遍历每一个 `items` 列表并将它们展开成多行记录以便于展示在同一张工作簿内不同行上.
```java
import com.alibaba.excel.EasyExcel;
import org.springframework.stereotype.Service;
@Service
public class ExportService {
public void exportOrders(String filePath, List<OrderDetail> orders){
try{
EasyExcel.write(filePath)
.head(head())
.sheet("订单详情")
.doWrite(data(orders));
} catch(Exception e){
throw new RuntimeException(e);
}
}
/**
* 构建头部信息.
*/
private static List<List<String>> head(){
List<List<String>> list = Lists.newArrayList();
// 添加固定部分的标题栏
list.add(Collections.singletonList("订单编号"));
list.add(Collections.singletonList("客户名称"));
// 动态添加子项对应的列名
list.add(Collections.singletonList("商品ID"));
list.add(Collections.singletonList("数量"));
list.add(Collections.singletonList("单价 (元)"));
return list;
}
/**
* 将原始数据转化为适合导出的形式.
*/
private static List<List<Object>> data(List<OrderDetail> details){
List<List<Object>> result = new ArrayList<>();
for(OrderDetail detail : details){
if(detail.getItems() != null && !detail.getItems().isEmpty()){
int size = detail.getItems().size();
// 遍历每个item并将其作为单独的一行加入到结果集中
for(int i=0;i<size;i++){
OrderItem item = detail.getItems().get(i);
List<Object> row = new ArrayList<>();
// 如果不是第一个元素,则留空前面两列
if(i==0 || "Y".equals(firstRowFlag)){
row.add(detail.getOrderNo());
row.add(detail.getCustomerName());
firstRowFlag="N";
}else{
row.add("");
row.add("");
}
row.add(item.getProductId());
row.add(item.getQuantity());
row.add(item.getUnitPrice());
result.add(row);
// 当前循环结束重置标志位
if(i==(size-1))firstRowFlag="Y";
}
}
}
return result;
}
}
```
上述代码片段展示了如何通过 Java 编程方式利用 Alibaba 开源组件 EasyExcel 来完成对含有复杂结构化数据类型的 Excel 表格文件的创建与保存过程[^1]。
阅读全文
相关推荐


















