当前位置: 首页 > news >正文

springboot的项目实现excel上传功能

在Spring Boot项目中实现Excel上传功能,可以通过以下步骤完成。这里使用Apache POI库处理Excel文件,并结合Spring MVC的文件上传功能。

步骤 1:添加依赖

pom.xml中添加以下依赖:

<!-- Spring Boot Web -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><!-- Apache POI for Excel -->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.3</version> <!-- 使用最新版本 -->
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version>
</dependency>

步骤 2:配置文件上传

application.properties中添加:

# 文件上传大小限制
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB

步骤 3:创建实体类

假设Excel包含用户数据:

public class User {private String name;private Integer age;private String email;// Getters and Setters
}

步骤 4:实现Excel解析工具类

import org.apache.poi.ss.usermodel.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.ArrayList;
import java.util.List;public class ExcelUtil {public static List<User> parseExcelFile(MultipartFile file) throws Exception {List<User> users = new ArrayList<>();Workbook workbook = WorkbookFactory.create(file.getInputStream());Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表for (Row row : sheet) {if (row.getRowNum() == 0) continue; // 跳过表头User user = new User();user.setName(getStringValue(row.getCell(0)));user.setAge(getIntValue(row.getCell(1)));user.setEmail(getStringValue(row.getCell(2)));users.add(user);}workbook.close();return users;}private static String getStringValue(Cell cell) {return cell == null ? "" : cell.getStringCellValue();}private static Integer getIntValue(Cell cell) {return cell == null ? null : (int) cell.getNumericCellValue();}
}

步骤 5:创建Controller

import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;@RestController
@RequestMapping("/api/excel")
public class ExcelUploadController {@PostMapping("/upload")public ResponseEntity<String> uploadExcel(@RequestParam("file") MultipartFile file) {if (file.isEmpty()) {return ResponseEntity.badRequest().body("文件为空");}try {List<User> users = ExcelUtil.parseExcelFile(file);// 这里处理业务逻辑(如保存到数据库)// userService.saveUsers(users);return ResponseEntity.ok("成功导入 " + users.size() + " 条数据");} catch (Exception e) {return ResponseEntity.internalServerError().body("导入失败: " + e.getMessage());}}
}

步骤 6:前端调用示例(HTML)

<form action="/api/excel/upload" method="post" enctype="multipart/form-data"><input type="file" name="file" accept=".xlsx, .xls"><button type="submit">上传Excel</button>
</form>

高级优化建议:

  1. 异步处理​:

    @Async
    public void processExcelAsync(MultipartFile file) {// 耗时操作
    }
  2. 批量插入数据库​:

    // 使用JPA批量保存
    @Transactional
    public void saveUsers(List<User> users) {userRepository.saveAll(users);
    }
  3. 验证Excel格式​:

    if (!file.getOriginalFilename().endsWith(".xlsx")) {throw new IllegalArgumentException("仅支持.xlsx格式");
    }
  4. 使用监听器模式(大文件处理)​​:

    考虑使用EasyExcel库(阿里开源)处理百万级数据:

    <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</version>
    </dependency>

处理流程:

  1. 前端提交表单 →

  2. Controller接收文件 →

  3. 工具类解析Excel →

  4. 转换为对象列表 →

  5. 执行业务逻辑(如存入数据库)

常见问题解决:

  • 乱码问题​:确保Excel保存为UTF-8格式

  • 日期格式​:使用DateUtil.getJavaDate(cell.getNumericCellValue())

  • 内存溢出​:对大文件使用SXSSFWorkbook或EasyExcel的流式读取

通过以上实现,你可以快速在Spring Boot项目中集成Excel上传功能,并根据实际需求扩展数据处理逻辑。


文章转载自:

http://hgMeQ8Ux.wbfLy.cn
http://JBIdTNw3.wbfLy.cn
http://Tti7CbGr.wbfLy.cn
http://EsP84gnU.wbfLy.cn
http://1QzyCcds.wbfLy.cn
http://6KIAPjdw.wbfLy.cn
http://cVJ49iem.wbfLy.cn
http://l1AH8E0R.wbfLy.cn
http://A6Tbmx4Y.wbfLy.cn
http://qPIxITtY.wbfLy.cn
http://eQd5hGVy.wbfLy.cn
http://IdH9mPnr.wbfLy.cn
http://IRNQg9rk.wbfLy.cn
http://GUyXiY2O.wbfLy.cn
http://EbTB6eQI.wbfLy.cn
http://zloUJKbu.wbfLy.cn
http://Kzba7EYm.wbfLy.cn
http://6wxh6y03.wbfLy.cn
http://GwHkqY7u.wbfLy.cn
http://JIyfQ2WW.wbfLy.cn
http://y35fbOyi.wbfLy.cn
http://GwyrsVaN.wbfLy.cn
http://Puoqd6X4.wbfLy.cn
http://OzSqmEzd.wbfLy.cn
http://wipwtmGK.wbfLy.cn
http://4A4HQlJL.wbfLy.cn
http://pab9wD1l.wbfLy.cn
http://BGvnvc8K.wbfLy.cn
http://nswOwpM1.wbfLy.cn
http://X9uu4n2M.wbfLy.cn
http://www.dtcms.com/a/385793.html

相关文章:

  • 从 Docker 守护进程获取实时事件
  • TCP编程:socket概念及使用方法(基础教程)
  • Python 在运维与云原生领域的核心应用:从基础到实践
  • 项目实战:Rsync + Sersync 实现文件实时同步
  • 云原生是什么
  • Docker 镜像瘦身实战:从 1.2GB 压缩到 200MB 的优化过程
  • RabbitMQ消息中间件
  • 2019年下半年 系统架构设计师 案例分析
  • OpenAI编程模型重磅升级!GPT-5-Codex发布,动态思考机制实现编程效率倍增
  • 数据结构排序入门(2):核心排序(选择排序,快速排序及优化)
  • 达索系统 SIMULIA 大中华区用户大会启幕,迅筑科技分享设计仿真一体化落地方案
  • 未来已来:当清洁成为一场静默的科技交响
  • 从零开始手写机器学习框架:我的深度学习之旅
  • Qt QML Switch和SwitchDelegate的区别?
  • MATLAB 线弹性 + 裂纹扩展 1D2D3D 统一框架
  • 基于Qt的跨平台全局输入事件监控技术实现
  • 从0到1入门JVM
  • Tessent_ijtag_ug——第 5 章IJTAG 网络插入 (1)
  • leetcode238.除自身以外数组的乘积
  • 【数据工程】6. 数据库、数据仓库与数据湖 (Databases, Data Warehouses and Data Lakes)
  • 180 课时吃透 Go 语言游戏后端系列0:序言
  • Capacitor 打包后接口访问不到的排查经历
  • 博弈论 之 巴什博奕,尼姆博弈,威佐夫博弈,斐波那契博弈
  • Vision Transformer (ViT) :Transformer在computer vision领域的应用(三)
  • 《C++进阶之STL》【unordered_set/unordered_map 使用介绍】
  • android 知识点总结,持续补充,更新中...
  • 【Web安全】CSV 注入的安全测试指南:从原理到防御实践
  • Unity休闲游戏性能checklist
  • 【vue3-element-admin 项目实战】:基于vue-pdf-embed 构建专业级PDF预览组件
  • QC七大工具与生活-控制图