SpringBoot + MySQL + EasyExcel 实现百万级数据报表自动化导出
下面给你一套非常实用、技术点明确、毕设/面试都能打的方案:
《基于 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 / 邮件推送
你现在处于:
👉 开题 / 中期 / 快答辩了 / 面试准备?
告诉我,我按你的目标给你“直接能交的内容”。
更多推荐
所有评论(0)