# springboot-excel-demo **Repository Path**: NSHspace/springboot-excel-demo ## Basic Information - **Project Name**: springboot-excel-demo - **Description**: 本项目是一个SpringBoot整合多种Excel操作库的演示项目,支持EasyExcel、EasyPoi和Hutool三种主流Excel操作库,提供统一的Excel导入导出功能。项目经过优化,保留了核心功能:导出任务列表、三种Excel库的上传下载功能、枚举转换和图片处理功能。 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 4 - **Created**: 2025-09-10 - **Last Updated**: 2025-09-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SpringBoot Excel 操作演示项目 ## 📋 项目介绍 本项目是一个SpringBoot整合多种Excel操作库的企业级演示项目,支持EasyExcel、EasyPoi和Hutool三种主流Excel操作库,提供统一的Excel导入导出功能。项目采用现代化架构设计,集成了完善的异步任务管理、图片处理和Excel图片提取功能,为企业级Excel操作提供了完整的解决方案。 本项目特别强化了Excel图片处理能力,新增了基于EasyExcel注解的图片导入功能,支持@ExcelProperty和@ExcelImageProperty注解的自动字段映射,实现了Excel数据读取与图片提取的完美结合。 ### 🎯 核心特性 #### 📊 Excel操作核心功能 - ✅ **统一Excel操作接口** - 支持EasyExcel、EasyPoi、Hutool三种库的无缝切换 - ✅ **异步任务管理** - 基于Redis的分布式任务队列,支持进度跟踪和状态管理 - ✅ **合并单元格导出** - 使用EnhancedExcelExporter实现复杂表格结构导出 - ✅ **多格式支持** - 支持.xlsx、.xls格式,兼容Excel 2003-2019 #### 🖼️ 图片处理专业功能 - ✅ **Excel图片提取** - 基于Apache POI 5.2.3,支持从Excel中提取嵌入图片 - ✅ **EasyExcel注解导入** - 支持@ExcelProperty和@ExcelImageProperty注解自动字段映射 - ✅ **图片压缩处理** - 智能图片压缩,支持指定目标大小 - ✅ **Web图片访问** - 提供RESTful API直接访问提取的图片资源 - ✅ **图片预览功能** - 前端实时预览,支持模态框查看和ESC键关闭 #### 🔧 系统架构特性 - ✅ **现代化Web界面** - 响应式设计,统一导航栏,移动端友好 - ✅ **完善的错误处理** - 分层异常处理,详细的错误日志和用户友好提示 - ✅ **跨平台兼容** - 支持Windows、Linux、macOS,使用系统临时目录 - ✅ **安全防护机制** - 防目录遍历攻击,文件类型验证,权限控制 - ✅ **性能优化** - 8KB缓冲区I/O,浏览器缓存策略,并发安全设计 ## 🛠️ 技术栈 ### 核心框架 - **Spring Boot 2.6.7** - 企业级应用开发框架 - **MyBatis Plus 3.5.2** - 增强型ORM框架,提供CRUD操作 - **MySQL 8.0+** - 关系型数据库 - **Redis 6.0+** - 内存数据库,用于缓存和任务管理 ### Excel操作库 - **EasyExcel 3.3.2** - 阿里巴巴开源,高性能低内存Excel操作库 - **EasyPoi 4.5.0** - 基于Apache POI封装,功能丰富的Excel操作库 - **Hutool 5.8.32** - 国产工具库,简单易用的Excel操作功能 - **Apache POI 5.2.3** - Excel图片提取和高级操作核心库 ### 开发环境 - **Java 1.8+** - 开发语言(建议使用Java 17) - **Maven 3.6+** - 项目构建工具 - **Lombok** - 代码简化工具 - **JSON处理** - 数据交换格式支持 ## 📁 项目结构 ``` src/main/java/cn/song/ ├── ExcelDemoApplication.java # 启动类 ├── annotation/ # 注解定义 │ ├── EasyExcel.java # EasyExcel注解 │ └── ExcelImageProperty.java # Excel图片属性注解 ├── config/ # 配置类 │ ├── convert/ # 枚举转换配置 │ │ ├── BaseEnumTypeConverter.java # 基础枚举转换器 │ │ ├── EasyExcelEnumConverter.java # EasyExcel枚举转换器 │ │ ├── ExcelUrlImageConverter.java # Excel图片转换器 │ │ ├── IntegerToEnumConverter.java # 整数到枚举转换器 │ │ ├── StringToEnumConverter.java # 字符串到枚举转换器 │ │ ├── factory/ # 转换器工厂 │ │ │ ├── IntegerCodeToEnumConverterFactory.java # 整数编码转换工厂 │ │ │ └── StringCodeToEnumConverterFactory.java # 字符串编码转换工厂 │ ├── FileConfig.java # 文件配置 │ ├── RedisService.java # Redis配置 │ ├── ThreadPoolConfig.java # 线程池配置 │ └── WebMvcConfig.java # Web配置 ├── constants/ # 常量定义 │ ├── BaseEnum.java # 基础枚举接口 │ └── enums/ # 枚举定义 │ └── GenderEnum.java # 性别枚举 ├── controller/ # 控制器层 │ ├── common/ # 通用控制器 │ │ ├── CommonController.java # 通用控制器 │ │ └── CommonService.java # 公共服务 │ ├── EnumController.java # 枚举转换控制器 │ ├── ExcelController.java # 统一Excel控制器 │ └── ImageController.java # 图片处理控制器 ├── entity/ # 实体类 ├── exception/ # 异常处理 ├── listener/ # 监听器 │ ├── ExcelListener.java # Excel监听器 │ └── ExcelOrderImportListener.java # Excel订单导入监听器 ├── mapper/ # 数据访问层 ├── model/ # 数据模型 ├── service/ # 服务层 └── util/ # 工具类 ├── easyexcel/ # EasyExcel工具 │ ├── DownloadUtil.java # 下载工具 │ ├── EasyExcelUtils.java # EasyExcel工具类 │ ├── EnhancedExcelExporter.java# 增强Excel导出工具 │ ├── ExcelReadImageUtil.java # Excel图片读取工具 │ └── model/ # EasyExcel模型 │ ├── BatchCount.java # 批量计数模型 │ ├── NoModelWriteData.java # 无模型写入数据 │ └── SimpleWriteData.java # 简单写入数据 ├── ExcelUtils.java # Excel工具类 ├── FilePath.java # 文件路径工具 ├── FileUtils.java # 文件工具类 ├── PageUtils.java # 分页工具类 ├── RedisUtil.java # Redis工具类 └── Tools.java # 通用工具类 ``` ## 🚀 功能特性 ### 1. 📊 统一Excel操作接口 - 支持多种Excel库的统一调用 - 提供标准化的导入导出功能 - 支持批量数据处理 ### 2. 📤 文件上传功能 - 支持Excel文件上传和解析 - 异步处理大文件 - 进度跟踪和状态反馈 ### 3. 📥 文件下载功能 - 支持Excel文件生成和下载 - 支持模板下载 - 支持自定义数据导出 ### 4. ⚙️ 任务管理 - Redis缓存任务状态 - 支持任务取消和进度查询 - 异步处理提升性能 ### 5. 🔄 枚举转换功能 - 支持性别枚举的编码和名称转换 - 提供枚举列表查询 - 支持枚举转换测试 ### 6. 🖼️ 图片处理功能 - **图片压缩** - 支持指定目标大小压缩图片 - **Excel图片提取** - 从Excel文件中提取嵌入图片 - **图片信息查询** - 获取图片文件详细信息 - **图片下载** - 支持图片文件下载 - **Web图片访问** - 通过API直接访问提取的图片 - **图片预览功能** - 前端支持图片预览和模态框查看 - **自定义保存路径** - 支持指定图片保存目录 - **模板下载功能** - 提供图片Excel模板下载,支持本地导出和流式下载 - **统一导航界面** - 所有测试页面都包含统一的导航栏,方便在不同功能间切换 ## 🔧 最新功能更新 ### 🖼️ Excel图片提取功能 - ✅ **智能图片识别** - 自动识别Excel中的嵌入图片 - ✅ **位置信息保存** - 保存图片在Excel中的行列位置 - ✅ **多格式支持** - 支持JPG、PNG、GIF等格式 - ✅ **自动文件命名** - 格式:image_[序号]_row[行号]_col[列号].[扩展名] - ✅ **自定义保存路径** - 支持指定图片保存目录 - ✅ **反射数据绑定** - 根据@ExcelImageProperty注解自动设置字段值 - ✅ **Web前端预览** - 支持在浏览器中直接预览提取的图片 ### 🔧 代码优化 - ✅ **方法重载设计** - readImage方法新增filePath参数重载 - ✅ **注释规范化** - 移除所有行尾注释,使用独立行注释 - ✅ **罗马数字标注** - 关键步骤使用ⅠⅡⅢ序号标注 - ✅ **完善文档注释** - 详细的Javadoc格式注释 ### 🐛 已修复的问题 - ✅ **临时目录路径问题** - 使用系统临时目录替代硬编码路径 - ✅ **NullPointerException** - 添加安全获取临时目录方法 - ✅ **静态初始化顺序** - 修复静态常量初始化顺序问题 - ✅ **跨平台兼容性** - 使用 `File.separator` 确保跨平台兼容 ### 🎨 界面优化 - ✅ **现代化UI设计** - 渐变背景和卡片式布局 - ✅ **响应式设计** - 完美适配桌面端和移动端 - ✅ **异步导出下载** - 专门的导出功能区域 - ✅ **用户体验优化** - 清晰的表单标签和图标化标题 ## 📡 API接口文档 ### 📋 完整的异步导出API流程 以下是完整的异步Excel导出API调用流程,展示了从任务创建到文件下载的完整生命周期: ```mermaid sequenceDiagram participant 用户 as 用户 participant 前端 as 前端页面 participant 后端 as ExcelController participant Redis as Redis缓存 participant 异步线程 as 异步导出线程 participant 文件系统 as 文件系统 用户->>前端: 点击"异步导出"按钮 前端->>后端: POST /api/excel/export?type=easyexcel 后端->>Redis: 检查防重复锁(Export_{account}) Redis-->>后端: 锁获取成功 后端->>Redis: 保存任务状态(队列中) 后端->>异步线程: 提交导出任务 后端-->>前端: 返回taskId 前端->>前端: 开始轮询任务状态 loop 每2秒轮询 前端->>后端: GET /api/excel/task/status/{taskId} 后端->>Redis: 查询任务状态 Redis-->>后端: 返回任务详情 后端-->>前端: 任务状态和进度 前端->>前端: 更新UI显示 end 异步线程->>Redis: 更新状态(导出中,20%) 异步线程->>异步线程: 查询数据 异步线程->>Redis: 更新状态(导出中,50%) 异步线程->>文件系统: 生成Excel文件 异步线程->>Redis: 更新状态(完成,100%) 异步线程->>Redis: 释放防重复锁 前端->>前端: 检测到完成状态,显示下载按钮 用户->>前端: 点击下载 前端->>后端: GET /api/excel/file/download/{taskId} 后端->>Redis: 验证任务状态 后端->>文件系统: 读取文件 后端-->>前端: 文件流下载 前端->>用户: 触发浏览器下载 ``` ### 🔄 任务状态流转图 ```mermaid stateDiagram-v2 [*] --> 队列中 : 任务创建 队列中 --> 导出中 : 开始处理 导出中 --> 导出完成 : 成功完成 导出中 --> 导出失败 : 发生异常 导出中 --> 已取消 : 用户取消 导出完成 --> [*] : 文件下载 导出失败 --> [*] : 错误处理 已取消 --> [*] : 任务终止 note right of 队列中 : exportStatus = 1 note right of 导出中 : exportStatus = 2 note right of 导出完成 : exportStatus = 3 note right of 导出失败 : exportStatus = 4 note right of 已取消 : exportStatus = 5 ``` ### 🛡️ 防重复提交机制 ```mermaid flowchart TD A[用户发起导出请求] --> B{检查Redis锁} B -->|锁不存在| C[创建导出锁] B -->|锁存在| D[返回:当前存在未完成任务] C --> E[创建导出任务] E --> F[异步执行导出] F --> G{导出完成?} G -->|是| H[释放锁] G -->|否| I[更新进度] I --> G H --> J[任务结束] style A fill:#e1f5fe style D fill:#ffebee style J fill:#e8f5e8 ``` ### 📊 Excel核心操作接口 | 接口路径 | 请求方法 | 功能描述 | 支持参数 | |----------|----------|----------|----------| | `/api/excel/upload` | POST | Excel文件上传解析 | file, type(easyexcel/easypoi/hutool) | | `/api/excel/download` | GET | Excel文件导出下载 | type(库类型) | | `/api/excel/template` | GET | Excel模板文件下载 | type(库类型) | | `/api/excel/batch` | POST | Excel异步批量处理 | file, type(库类型) | | `/api/excel/export` | POST | Excel异步导出任务 | type(库类型) | | `/api/excel/downloads` | POST | 异步导出任务列表 | 用户数据对象 | ### 📋 任务管理接口 | 接口路径 | 请求方法 | 功能描述 | 参数说明 | |----------|----------|----------|----------| | `/api/excel/task/list` | GET | 获取用户任务列表 | account, model | | `/api/excel/task/cancel/{taskId}` | POST | 取消指定任务 | taskId(路径参数) | | `/api/excel/task/status/{taskId}` | GET | 查询任务执行状态 | taskId(路径参数) | ### 🔄 枚举转换接口 | 接口路径 | 请求方法 | 功能描述 | 参数说明 | |----------|----------|----------|----------| | `/api/enum/gender/list` | GET | 获取性别枚举列表 | 无参数 | | `/api/enum/gender/{code}` | GET | 根据编码获取枚举 | code(路径参数) | | `/api/enum/gender/name/{name}` | GET | 根据名称获取枚举 | name(路径参数) | | `/api/enum/gender/convert` | POST | 性别编码转换测试 | code(表单参数) | | `/api/enum/gender/convert/name` | POST | 性别名称转换测试 | name(表单参数) | ### 🖼️ 图片处理专业接口 | 接口路径 | 请求方法 | 功能描述 | 参数说明 | |----------|----------|----------|----------| | `/api/image/extract/excel` | POST | Excel图片提取(基础版) | file(Excel文件) | | `/api/image/extract/excel/easyexcel` | POST | Excel图片提取(EasyExcel注解版) | file(Excel文件) | | `/api/image/compress` | POST | 智能图片压缩 | file, targetSizeKb | | `/api/image/view` | GET | Web图片资源访问 | imagePath(查询参数) | | `/api/image/download` | GET | 图片文件下载 | filePath | | `/api/image/info` | GET | 图片文件信息查询 | filePath | | `/api/image/template/download/local` | POST | 图片模板导出到本地 | 无参数 | | `/api/image/template/download/easyexcel` | GET | EasyExcel导入模板下载 | 无参数 | ## 🚀 快速开始 ### 1. 环境准备 ```bash # 克隆项目 git clone https://github.com/your-repo/springboot-excel-demo.git # 进入项目目录 cd springboot-excel-demo # 安装依赖 mvn clean install ``` ### 2. 配置数据库 修改 `application.yml` 中的数据库配置: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/excel_demo?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: your_username password: your_password ``` ### 3. 启动项目 ```bash # 启动应用 mvn spring-boot:run # 或者打包后运行 mvn clean package java -jar target/springboot-excel-demo-1.0-SNAPSHOT.jar ``` ### 4. 访问应用 - **主页面**: http://localhost:8060 - **图片压缩测试**: http://localhost:8060/test_image.html - **图片提取测试**: http://localhost:8060/test_image_extraction.html ★ - **EasyExcel图片导入测试**: http://localhost:8060/test_easyexcel_import.html ★★ - **异步导出测试**: http://localhost:8060/test_downloads.html > ★ 图片提取测试页面现已包含: > - 下载图片Excel模板按钮 > - 统一的导航栏 > - 完整的图片提取和预览功能 ## 💡 使用示例 ### 上传Excel文件 ```bash curl -X POST http://localhost:8060/api/excel/upload \ -F "file=@data.xlsx" \ -F "type=easyexcel" ``` ### 下载Excel文件 ```bash curl -X GET http://localhost:8060/api/excel/download?type=easyexcel ``` ### 异步导出下载 ```bash curl -X POST http://localhost:8060/api/excel/downloads \ -H "Content-Type: application/json" \ -d '{"id":"test","name":"测试用户","age":25,"gender":1}' ``` ### 获取任务列表 ```bash curl -X GET http://localhost:8060/api/excel/task/list?account=test&model=4 ``` ### 枚举转换测试 ```bash curl -X POST http://localhost:8060/api/enum/gender/convert \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "code=1" ``` ### 图片压缩 ```bash curl -X POST http://localhost:8060/api/image/compress \ -F "file=@image.jpg" \ -F "targetSizeKb=100" ``` ### Excel图片提取 ```bash curl -X POST http://localhost:8060/api/image/extract/excel \ -F "file=@excel_with_images.xlsx" ``` ### Web访问提取的图片 ```bash # 直接在浏览器访问 http://localhost:8060/api/image/view/image_1_row2_col3.jpg ``` ### 下载图片Excel模板 ```bash # 通过流下载模板(推荐) curl -X GET "http://localhost:8060/api/image/template/download/stream" -o image_template.xlsx # 或者下载到服务器本地 curl -X POST http://localhost:8060/api/image/template/download/local ``` ### 前端测试页面使用 ``` 1. 访问: http://localhost:8060/test_image_extraction.html 2. 点击“下载图片模板”按钮获取测试文件 3. 上传模板文件并点击“提取图片” 4. 查看实时预览和统计信息 5. 点击图片进入模态框查看 ``` ## 📊 三种Excel库对比 | 特性 | EasyExcel | EasyPoi | Hutool | |------|-----------|---------|--------| | 内存占用 | 低 | 中等 | 中等 | | 性能 | 高 | 中等 | 中等 | | 功能丰富度 | 高 | 高 | 中等 | | 学习成本 | 低 | 中等 | 低 | | 社区活跃度 | 高 | 中等 | 高 | ## 🔧 开发指南 ### 合并单元格导出功能 项目新增了基于EnhancedExcelExporter的合并单元格导出功能,适用于具有主从关系或分组数据的场景。该功能支持根据指定字段合并相同数据的单元格,提高数据可读性。 使用示例: ```java // 1. 创建合并策略 EnhancedExcelExporter.MergeStrategy mergeStrategy = EnhancedExcelExporter.createIdBasedMergeStrategy( RefundPackageExportDTO::getPackageId, // ID提取器 dto -> 1, // 每个DTO占一行 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 // 合并列索引 ); // 2. 创建导出配置 EnhancedExcelExporter.ExportConfig config = new EnhancedExcelExporter.ExportConfig<>(RefundPackageExportDTO.class) .withMergeStrategy(mergeStrategy); // 3. 执行导出 EnhancedExcelExporter.export(outputStream, "退货管理", exportData, config); ``` ### 适用场景 1. **主从表结构数据导出**:如退货包裹和货品信息 2. **分组数据导出**:如部门员工列表 3. **时间序列数据导出**:按日期合并相同数据 4. **复杂报表导出**:需要合并相同信息以提高可读性 ### 功能特点 - **灵活配置**:支持自定义合并策略和列索引 - **智能合并**:根据指定字段值自动合并相同数据的单元格 - **复杂数据处理**:支持一对多关系数据的展平和合并 - **兼容性好**:基于标准Excel格式,兼容各类Office软件 ### 添加新的Excel库支持 1. 在 `service` 包下创建新的服务实现类 2. 实现 `ExcelService` 接口 3. 在 `ExcelController` 中添加对应的处理逻辑 4. 更新配置和依赖 ### 自定义Excel模板 1. 在 `resources/templates` 目录下放置模板文件 2. 修改 `ExcelUtils` 中的模板处理逻辑 3. 更新相关的实体类和映射关系 ### 添加新的枚举类型 1. 在 `constants/enums` 包下创建新的枚举类 2. 实现 `BaseEnum` 接口 3. 在 `EnumController` 中添加对应的API接口 ## ⚠️ 注意事项 1. **依赖冲突**:项目同时使用多种Excel库,已通过exclusion排除冲突依赖 2. **内存管理**:大文件处理时注意内存使用,建议使用流式处理 3. **异步处理**:文件上传后异步处理,避免阻塞用户请求 4. **错误处理**:完善的异常处理机制,提供详细的错误信息 5. **文件清理**:定期清理临时文件,避免磁盘空间不足 6. **临时目录**:使用系统临时目录,确保跨平台兼容性 7. **图片安全**:图片访问接口包含安全检查,防止目录遍历攻击 8. **缓存策略**:图片访问接口设置了适当的浏览器缓存策略 9. **注释规范**:代码注释使用罗马数字标注关键步骤,禁止行尾注释 10. **Java版本**:项目需要Java 1.8及以上版本,建议使用Java 17 3. 在 `EnumController` 中添加对应的API接口 ### Excel图片处理开发指南 1. **自定义图片保存路径**: ```java ExcelReadImageUtil.readImage(inputStream, list, "your/custom/path/"); ``` 2. **扩展@ExcelImageProperty注解**: ```java @ExcelImageProperty(index = 3) // 指定对应的Excel列 private String customImageField; ``` 3. **添加新的图片处理逻辑**: - 继承现有的图片处理方法 - 实现自定义的图片转换器 - 添加图片压缩或格式转换功能 3. 在 `EnumController` 中添加对应的API接口 ## ⚠️ 注意事项 1. **依赖冲突**:项目同时使用多种Excel库,已通过exclusion排除冲突依赖 2. **内存管理**:大文件处理时注意内存使用,建议使用流式处理 3. **异步处理**:文件上传后异步处理,避免阻塞用户请求 4. **错误处理**:完善的异常处理机制,提供详细的错误信息 5. **文件清理**:定期清理临时文件,避免磁盘空间不足 6. **临时目录**:使用系统临时目录,确保跨平台兼容性 ## 📝 更新日志 ### v1.5.0 (2025-08-28) 🆕 最新版本 ✨ EasyExcel注解导入功能 - 新增基于`@ExcelProperty`和`@ExcelImageProperty`注解的图片导入 ✨ 自动字段回显 - 图片提取后自动将文件路径设置到对应字段 ✨ EasyExcel导入模板 - 新增`/api/image/template/download/easyexcel`接口 ✨ 性能监控增强 - 详细的分阶段性能统计(工作簿加载、数据读取、图片处理) ✅ 监听器机制优化 - 使用自定义监听器实现数据读取与图片处理的结合 ✅ 并发安全优化 - 使用`ConcurrentHashMap`保证线程安全 ✅ 图片提取功能测试页面新增下载模板按钮,支持一键下载图片Excel模板 ✅ 所有测试页面添加统一导航栏,支持快速在不同功能间切换 ### v1.3.0 (2025-08-28) ✅ 新增Excel图片提取功能,支持从.xlsx文件中提取嵌入图片 ✅ 添加`ExcelReadImageUtil.readImage`方法重载,支持自定义保存路径 ✅ 新增图片预览功能,支持模态框查看和ESC键关闭 ✅ 添加图片Excel模板下载功能 ✅ 支持`@ExcelImageProperty`注解自动字段绑定 ### v1.2.0 (2025-08-05) - ✅ 新增合并单元格导出功能 - ✅ 添加EnhancedExcelExporter工具类 - ✅ 支持复杂数据结构的合并导出 - ✅ 提供Web界面测试入口 ### v1.1.0 (2025-08-03) - ✅ 修复临时目录路径问题 - ✅ 修复NullPointerException错误 - ✅ 优化页面样式和用户体验 - ✅ 添加异步导出下载功能 - ✅ 增强错误处理和日志记录 ### v1.0.0 (2025-01-06) - 🎉 项目初始版本 - ✅ 支持三种Excel库操作 - ✅ 实现任务管理功能 - ✅ 添加枚举转换功能 - ✅ 实现图片处理功能 ## 🤝 贡献说明 1. 部分功能借鉴于 https://github.com/xkcoding/owntest.git 2. Excel图片提取功能基于Apache POI 5.2.3实现 3. 欢迎提交Issue和Pull Request 4. 请遵循项目的代码规范和提交规范 5. 代码注释请使用罗马数字标注关键步骤 6. 禁止使用行尾注释,必须使用独立行注释 ## 📄 许可证 本项目采用 MIT 许可证,详见 LICENSE 文件。 ## 📞 联系方式 如有问题或建议,请通过以下方式联系: - 📧 Email: 3064597532@qq.com - 🐛 Issues: [springboot-excel-demo](https://gitee.com/songrenshuo/springboot-excel-demo/issues)