Spring Boot 中使用 JPA 规范时,实体类通常会包含一些关联关系,如一对一、一对多或多对多等。这些关联关系在序列化为 JSON 时,可能会导致返回的数据结构非常复杂,包含大量的嵌套对象。为了将这样的数据导出到 Excel,我们需要将这些嵌套的数据结构展平成一个更易于处理的格式。
JPA(Java Persistence API):Java 的持久化框架,用于将对象映射到数据库表。
Spring Boot:一个用于简化 Spring 应用初始搭建以及开发过程的框架。
JSON(JavaScript Object Notation):一种轻量级的数据交换格式。
Excel:Microsoft 的电子表格软件,广泛用于数据分析和报告。
User
和 UserProfile
。Department
和 Employee
。Student
和 Course
。问题:JPA 实体中的嵌套关系导致 JSON 结构复杂,难以导出到 Excel。
原因:JPA 实体通常包含关联关系,这些关系在序列化为 JSON 时会形成嵌套结构。
解决方法:
public class UserDTO {
private Long id;
private String name;
private String email;
private String departmentName; // 新增字段用于展平关系
// 构造函数、getter 和 setter 省略
}
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public List<UserDTO> getUsersWithDepartment() {
List<User> users = userRepository.findAll();
return users.stream().map(user -> {
UserDTO dto = new UserDTO();
dto.setId(user.getId());
dto.setName(user.getName());
dto.setEmail(user.getEmail());
dto.setDepartmentName(user.getDepartment().getName()); // 展平 department 关系
return dto;
}).collect(Collectors.toList());
}
}
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/export")
public ResponseEntity<List<UserDTO>> exportUsers() {
List<UserDTO> users = userService.getUsersWithDepartment();
return ResponseEntity.ok(users);
}
}
可以使用 Apache POI 或其他库将 DTO 列表导出为 Excel 文件。
public void exportToExcel(List<UserDTO> users, OutputStream outputStream) throws IOException {
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Users");
// 创建表头
Row headerRow = sheet.createRow(0);
headerRow.createCell(0).setCellValue("ID");
headerRow.createCell(1).setCellValue("Name");
headerRow.createCell(2).setCellValue("Email");
headerRow.createCell(3).setCellValue("Department");
// 填充数据
int rowNum = 1;
for (UserDTO user : users) {
Row row = sheet.createRow(rowNum++);
row.createCell(0).setCellValue(user.getId());
row.createCell(1).setCellValue(user.getName());
row.createCell(2).setCellValue(user.getEmail());
row.createCell(3).setCellValue(user.getDepartmentName());
}
workbook.write(outputStream);
workbook.close();
}
通过上述方法,可以将复杂的 JPA 实体展平为简单的 DTO 对象,从而方便地将数据导出到 Excel 文件中。
领取专属 10元无门槛券
手把手带您无忧上云