You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 18:15:01