Spring Boot WebFlux如何读取Postman上传的Excel文件内容
可行实现方案
完全可以实现,以下是适配Spring Boot 2.3.9 + Java 8的完整落地方案:
1. 依赖引入
在pom.xml中添加核心依赖:
<!-- Spring Boot WebFlux 核心依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> <version>2.3.9.RELEASE</version> </dependency> <!-- Alibaba EasyExcel Excel处理工具,兼容Java8,内存占用低 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.1.5</version> </dependency>
2. 核心代码实现
2.1 Excel行映射实体
根据你的Excel表头定义对应实体类,用于自动映射字段:
import com.alibaba.excel.annotation.ExcelProperty; public class ExcelRowData { // index对应Excel列的顺序,从0开始 @ExcelProperty(index = 0) private String column1; @ExcelProperty(index = 1) private Integer column2; // 省略getter、setter }
2.2 Excel读取监听器
EasyExcel采用异步读取,需要自定义监听器存储读取到的行数据:
import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import java.util.ArrayList; import java.util.List; public class ExcelDataListener extends AnalysisEventListener<ExcelRowData> { private final List<ExcelRowData> dataList = new ArrayList<>(); // 每读取一行都会调用该方法 @Override public void invoke(ExcelRowData rowData, AnalysisContext analysisContext) { dataList.add(rowData); } // 读取完成后调用 @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { // 可在这里加读取完成后的自定义逻辑 } public List<ExcelRowData> getDataList() { return dataList; } }
2.3 WebFlux 控制器代码
import com.alibaba.excel.EasyExcel; import org.springframework.http.MediaType; import org.springframework.http.codec.multipart.FilePart; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import reactor.core.publisher.Mono; import reactor.core.scheduler.Schedulers; import java.io.InputStream; import java.util.List; @RestController public class ExcelUploadController { @PostMapping(value = "/upload/excel", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public Mono<List<ExcelRowData>> uploadExcel(@RequestPart("file") FilePart filePart) { // 把阻塞的IO操作放到boundedElastic调度器执行,避免阻塞WebFlux事件循环线程 return Mono.fromCallable(() -> { // 读取文件输入流 InputStream inputStream = filePart.content() .map(dataBuffer -> dataBuffer.asInputStream()) .reduce(InputStream::sequence) .block(); // 用EasyExcel读取所有行 ExcelDataListener listener = new ExcelDataListener(); EasyExcel.read(inputStream, ExcelRowData.class, listener).sheet().doRead(); return listener.getDataList(); }).subscribeOn(Schedulers.boundedElastic()); } }
3. Postman请求配置
按以下步骤配置请求即可:
- 请求方式选择
POST,填入接口地址:http://{你的服务地址}/upload/excel - 切换到
Body选项卡,选择form-data类型 - 新增key为
file,key类型选择File,点击Value列的选择按钮上传本地Excel文件 - 直接点击发送即可收到返回的所有Excel行数据
4. 注意事项
- 若上传文件超过默认大小限制,可在application.yml中添加配置调整:
spring: webflux: multipart: max-file-size: 20MB # 单个文件最大大小 max-request-size: 20MB # 请求总大小 codec: max-in-memory-size: 20MB # 缓冲最大大小
- Excel读取属于阻塞IO操作,必须通过
Schedulers.boundedElastic()调度,否则会导致WebFlux核心线程阻塞,影响服务整体性能 - 该方案兼容
.xls、.xlsx两种Excel格式,无需额外适配
内容的提问来源于stack exchange,提问作者Mr.Code
相关产品推荐
相关产品推荐

