下面给你一套非常实用、技术点明确、毕设/面试都能打的方案:

《基于 SpringBoot + MySQL + EasyExcel 的百万级数据报表自动化导出》

✅ 解决 内存溢出

✅ 支持 百万级数据

✅ 适合 毕设 / 课设 / 企业实战 / 面试项目


一、业务背景(论文 / 技术博客通用)

在企业级系统中,数据报表导出是常见需求。传统方式存在的问题:

  • 数据量大时容易 内存溢出(OOM)

  • 导出时间长,接口超时

  • 重复劳动,缺乏自动化

  • Excel 生成慢、文件体积大

本系统基于 SpringBoot + MyBatis + EasyExcel,实现了:

✅ 百万级数据 流式导出

✅ 分页查询 + 内存复用

✅ 报表任务自动化

✅ 导出进度可追踪


二、技术架构

前端(按钮触发)
↓
SpringBoot Controller
↓
ReportService
├── 分页查询 MySQL
├── EasyExcel 流式写 Excel
└── 任务状态管理
↓
MySQL(业务数据)

技术

作用

SpringBoot

快速开发

MyBatis

分页查询

EasyExcel(阿里)

高性能 Excel 写入

MySQL

数据源

ThreadPoolExecutor

异步导出


三、数据库设计(示例)

以「用户订单」为例:

CREATE TABLE orders (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  order_no VARCHAR(50),
  user_name VARCHAR(50),
  amount DECIMAL(10,2),
  create_time DATETIME,
  status INT
);

📌 百万级数据靠索引支撑

CREATE INDEX idx_create_time ON orders(create_time);

四、核心思路(⭐重点)

❌ 传统做法(危险)

List<Order> list = orderMapper.selectAll(); // 全量加载

➡️ 100 万条数据直接 OOM


✅ 正确做法:分页 + 流式写

分页查询(每次 1000 条)
   ↓
EasyExcel 追加写入
   ↓
循环直到最后一页

五、核心代码实现

1️⃣ 实体类 + Excel 注解

@Data
public class OrderExportVO {

    @ExcelProperty("订单号")
    private String orderNo;

    @ExcelProperty("用户名称")
    private String userName;

    @ExcelProperty("订单金额")
    private BigDecimal amount;

    @ExcelProperty("创建时间")
    private LocalDateTime createTime;
}

2️⃣ Mapper(分页查询)

@Mapper
public interface OrderMapper {

    @Select("SELECT * FROM orders LIMIT #{offset}, #{pageSize}")
    List<OrderExportVO> selectPage(
        @Param("offset") int offset,
        @Param("pageSize") int pageSize
    );
}

3️⃣ Service(百万级导出核心)

@Service
public class ReportService {

    @Autowired
    private OrderMapper orderMapper;

    public void exportExcel(OutputStream outputStream) {

        ExcelWriter writer = EasyExcel.write(outputStream, OrderExportVO.class)
                .build();

        WriteSheet sheet = EasyExcel.writerSheet("订单数据").build();

        int pageSize = 1000;
        int pageNum = 0;
        List<OrderExportVO> list;

        do {
            int offset = pageNum * pageSize;
            list = orderMapper.selectPage(offset, pageSize);

            if (!list.isEmpty()) {
                writer.write(list, sheet);
            }
            pageNum++;
        } while (!list.isEmpty());

        writer.finish();
    }
}

📌 内存占用极低,可稳定导出百万级数据


4️⃣ Controller

@GetMapping("/export")
public void export(HttpServletResponse response) throws IOException {

    response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    response.setCharacterEncoding("utf-8");
    String fileName = URLEncoder.encode("订单报表", "UTF-8");

    response.setHeader("Content-Disposition",
            "attachment;filename=" + fileName + ".xlsx");

    reportService.exportExcel(response.getOutputStream());
}

六、异步导出(⭐进阶)

1️⃣ 异步任务

@Async
public void asyncExport(Long taskId) {
    // 更新任务状态为「进行中」
    taskMapper.updateStatus(taskId, 1);

    try {
        exportExcel(new FileOutputStream("task_" + taskId + ".xlsx"));
        taskMapper.updateStatus(taskId, 2); // 成功
    } catch (Exception e) {
        taskMapper.updateStatus(taskId, 3); // 失败
    }
}

2️⃣ 任务表

CREATE TABLE export_task (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  file_name VARCHAR(100),
  status INT,
  create_time DATETIME
);

七、性能优化建议(论文加分)

✅ 分页大小建议:500 ~ 2000

✅ MySQL 添加合适索引

✅ 使用连接池(Druid)

✅ 异步导出 + 任务表

✅ 大文件拆分为多个 Sheet


八、系统特色(⭐答辩亮点)

✅ EasyExcel 解决 OOM 问题

✅ 分页 + 流式写,百万级稳定

✅ 支持异步导出,不阻塞主线程

✅ 可扩展为定时报表

✅ 实战性强,企业真实场景


九、可扩展方向(体现工作量)

✅ 定时任务自动生成报表(Quartz / XXL-JOB)

✅ 多 Sheet 拆分

✅ 数据过滤 / 条件导出

✅ 报表邮件推送

✅ 分布式任务调度

✅ 前端进度条轮询


十、毕设论文结构建议

章节

内容

第1章

绪论

第2章

相关技术

第3章

需求分析

第4章

系统设计

第5章

核心实现(分页 + EasyExcel)

第6章

性能测试

第7章

总结与展望


十一、我可以继续帮你做的事 ✅

  • ✅ 给你 完整 SpringBoot 项目

  • ✅ 写 第4 / 第5 章论文

  • ✅ 写 JMeter / 性能测试方案

  • ✅ 画 架构图 / 流程图

  • ✅ 写 答辩稿 + PPT

  • ✅ 扩展 定时任务 / 多Sheet / 邮件推送

你现在处于:

👉 开题 / 中期 / 快答辩了 / 面试准备?

告诉我,我按你的目标给你“直接能交的内容”。

更多推荐