在现代应用开发中,数据的导出和处理是一个非常常见的需求。Spring Cloud 和 Easy Excel 是两个强大的工具,可以帮助我们高效地完成这个任务。本文将介绍如何将这两个工具结合起来,实现表格数据的导出功能。
1.环境准备
在开始之前,我们需要确保开发环境已经配置好,并且项目中引入了相关的依赖。本文以 Spring Boot 项目为例,使用 Maven 来管理依赖。
1.1.添加依赖
我们需要在对应微服务模块的 pom.xml
文件中添加 Spring Boot 和 Easy Excel 的相关依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>4.0.2</version>
</dependency>
2.创建数据模型
我们需要创建一个数据模型类,这个类将用来表示我们要导出的数据:
@Data
@TableName("port_info")
public class PortInfoModel implements Serializable {
@Serial
@TableField(exist = false)
private static final long serialVersionUID = 1L;
@TableId("port_id")
@Schema(description = "港口编号")
@ExcelProperty("港口编号")
private String portId;
@Schema(description = "港口名称")
@ExcelProperty("港口名称")
private String portName;
@Schema(description = "港口状态")
@ExcelProperty("港口状态")
private String portStatus;
}
这里博主用了 Lombok 的注解自动生成 Getter、Setter、toString 方法;
@TableName、@TableId、@TableField是 MyBatis-Plus 中的注解:
Spring Cloud 集成 MyBatis/MyBatis-Plus 请参考:Spring Cloud微服务项目集成MyBatis
@Serial 是 Swagger 中的注解:
Spring Cloud 集成 Swagger 请参考:Spring Cloud微服务项目聚合Swagger文档
3.创建导出服务
接下来,我们创建一个服务类,负责生成 Excel 文件并将其返回给客户端:
/*
* 这里博主将整个方法封装好,以便后续的复用
*/
public class ExportFileTools {
public static <T> void exportExcel(HttpServletResponse response, List<T> list, Class<T> clazz) {
LocalDate currentDate = LocalDate.now();
String fileName = currentDate.format(DateTimeFormatter.ofPattern("yyyyMMdd")) + ".xlsx";
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), clazz).build()) {
WriteSheet writeSheet = EasyExcel.writerSheet("sheet1").build();
excelWriter.write(list, writeSheet);
} catch (java.io.IOException e) {
// Handle the exception, e.g., log it or send an error response
throw new RuntimeException(e);
}
}
}
3.在Controller层进行调用
最后,我们需要创建一个控制器类来处理 HTTP 请求,并调用导出服务:
@RestController
@RequestMapping("/api/auth/system/port")
@Tag(name = "港口管理")
public class PortController {
private final PortService portService;
@Autowired
public PortController(PortService portService) {
this.portService = portService;
}
@PostMapping("/export")
@Operation(summary = "导出数据", parameters = {
@Parameter(
name = "Authorization",
description = "TOKEN",
in = ParameterIn.HEADER,
required = true,
schema = @Schema(type = "string")
)
})
@Log(title = "导出数据", businessType = BusinessType.OTHER)
public void exportExcel(@RequestBody PortInfoModel model, HttpServletResponse response) {
/* 对导出的数据做一个查询 */
LambdaQueryWrapper<PortInfoModel> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.like(model.getPortName() != null, PortInfoModel::getPortName, model.getPortName());
List<PortInfoModel> list = portService.getBaseMapper().selectList(queryWrapper);
/* 调用我们先前封装好的函数 */
ExportFileTools.exportExcel(response, list, PortInfoModel.class);
}
}
4.接口测试
博主这里因为配置了Swagger,所以直接在Swagger上进行接口测试: