【Java基础】使用Apache POI和Spring Boot实现Excel文件上传和解析功能
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
- 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
- 导航
- 檀越剑指大厂系列:全面总结 java 核心技术,jvm,并发编程 redis,kafka,Spring,微服务等
- 常用开发工具系列:常用的开发工具,IDEA,Mac,Alfred,Git,typora 等
- 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
- 新空间代码工作室:提供各种软件服务,承接各种毕业设计,毕业论文等
- 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
- 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨
博客目录
- 一、技术选型与环境搭建
- (一)Apache POI 库简介
- (二)Spring Boot 框架简介
- (三)环境搭建
- 二、Excel 文件上传接口实现
- (一)创建控制器
- (二)文件读取与解析
- (三)数据解析与存储
- (四)数据处理与响应
- 三、前端页面实现
- (一)创建 HTML 页面
在现代企业应用开发中,数据的导入和导出是一项常见且重要的功能需求。Excel 作为一种广泛使用的电子表格工具,因其直观、易用的特性,常常被用来存储和展示数据。因此,实现 Excel 文件的上传和解析功能,能够方便地将外部数据导入到系统中,对于提高工作效率、实现数据共享具有重要意义。
一、技术选型与环境搭建
(一)Apache POI 库简介
Apache POI 是一个开源的 Java 库,用于处理 Microsoft Office 文档。它提供了对 Excel 文件的读写支持,能够处理 Excel 97-2003(.xls)和 Excel 2007+(.xlsx)两种格式。POI 通过提供丰富的 API,使得开发者能够方便地操作 Excel 文件中的单元格、行、列、工作表等元素,实现数据的读取、写入、格式化等功能。
(二)Spring Boot 框架简介
Spring Boot 是一个基于 Spring 框架的项目,旨在简化 Spring 应用的开发过程。它通过提供一系列的“Starters”依赖管理和自动配置功能,使得开发者能够快速搭建起一个 Spring 应用。Spring Boot 还内置了 Tomcat 容器,无需部署 WAR 包,可以直接运行 Spring 应用,极大地简化了部署流程。此外,Spring Boot 还支持 RESTful API 的开发,通过注解的方式能够轻松实现数据的接收和响应。
(三)环境搭建
- 开发工具:推荐使用 IntelliJ IDEA 或 Eclipse 等主流的 Java 开发工具,它们提供了丰富的插件支持和便捷的代码提示功能,有助于提高开发效率。
- JDK 版本:需要安装 JDK 1.8 或更高版本,因为 Spring Boot 和 Apache POI 都依赖于 Java 8 及以上版本的新特性。
- 依赖管理:使用 Maven 或 Gradle 作为项目的依赖管理工具。在项目的
pom.xml
文件中引入 Apache POI 和 Spring Boot 相关的依赖。<!-- Apache POI依赖 --> <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> <!-- Spring Boot Web依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.7.5</version> </dependency> <!-- Spring Boot文件上传依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <version>2.7.5</version> </dependency>
- 项目结构:创建一个 Spring Boot 项目,并在项目中创建相应的包结构,如
controller
、service
、model
等,用于存放控制器、服务层代码和数据模型等。
二、Excel 文件上传接口实现
(一)创建控制器
在 Spring Boot 项目中创建一个控制器类ExcelController
,用于处理 Excel 文件的上传请求。使用@RestController
注解来定义控制器,表示该控制器中的所有方法都会返回 JSON 格式的数据。
@RestController
public class ExcelController {
// 文件上传接口
@PostMapping("/upload")
public Result upload(@RequestParam("file") MultipartFile file) {
// 文件上传处理逻辑
}
}
在upload
方法中,使用@PostMapping
注解来指定请求的 URL 路径为/upload
,并使用@RequestParam
注解来接收前端上传的文件。MultipartFile
是 Spring 提供的一个接口,用于表示上传的文件。
(二)文件读取与解析
在upload
方法中,首先获取上传文件的输入流,然后使用 Apache POI 库来读取和解析 Excel 文件。
try (InputStream inputStream = file.getInputStream()) {
Workbook workbook = WorkbookFactory.create(inputStream); // 使用WorkbookFactory来自动处理不同格式的Excel文件
Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表
// 解析Excel数据的逻辑
}
WorkbookFactory.create(inputStream)
方法会根据输入流中的文件格式自动创建相应的Workbook
对象,无论是.xls
还是.xlsx
格式的 Excel 文件都能被正确处理。workbook.getSheetAt(0)
方法用于获取 Excel 文件中的第一个工作表。
(三)数据解析与存储
在获取到工作表后,可以遍历工作表中的每一行和每一列,将数据解析出来并存储到合适的数据结构中。通常情况下,第一行是列名,从第二行开始是实际的数据。
List<Map<String, String>> data = new ArrayList<>();
Row headerRow = sheet.getRow(0); // 获取第一行作为列名
String[] headers = new String[3];
for (int i = 0; i < 3; i++) {
headers[i] = headerRow.getCell(i).getStringCellValue();
}
for (int i = 1; i <= sheet.getLastRowNum(); i++) {
Row row = sheet.getRow(i);
Map<String, String> rowData = new HashMap<>();
for (int j = 0; j < 3; j++) {
Cell cell = row.getCell(j);
String cellValue = "";
if (cell != null) {
switch (cell.getCellType()) {
case STRING:
cellValue = cell.getStringCellValue();
break;
case NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
cellValue = cell.getDateCellValue().toString();
} else {
cellValue = String.format("%.0f", cell.getNumericCellValue());
}
break;
case BOOLEAN:
cellValue = String.valueOf(cell.getBooleanCellValue());
break;
case FORMULA:
cellValue = cell.getCellFormula();
break;
default:
cellValue = "";
}
}
rowData.put(headers[j], cellValue);
}
data.add(rowData);
}
在上述代码中,首先读取第一行的列名,并存储到headers
数组中。然后从第二行开始遍历每一行的数据,对于每个单元格,根据其类型(字符串、数值、日期、布尔值、公式等)进行相应的处理,并将解析出的数据存储到rowData
这个Map
中,其中键为列名,值为单元格的值。最后将每一行的数据rowData
添加到data
这个列表中。
(四)数据处理与响应
在解析完 Excel 文件中的数据后,可以根据实际需求对数据进行进一步的处理,例如存储到数据库中。在本示例中,仅简单地将解析出的数据打印到控制台,并返回一个结果对象表示操作是否成功。
System.out.println("读取到的数据: " + data);
return Result.ok("导入excel完成");
如果在处理过程中发生异常,则捕获异常并返回错误结果。
} catch (Exception e) {
e.printStackTrace();
return Result.error("导入excel失败");
}
三、前端页面实现
(一)创建 HTML 页面
在 Spring Boot 项目的src/main/resources/static
目录下创建一个 HTML 页面,用于实现文件上传的功能。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Excel文件上传</title>
</head>
<body>
<h1>Excel文件上传</h1>
<form id="uploadForm" enctype="multipart/form-data">
<input type="file" id="file" name="file" accept=".xls,.xlsx" />
<button type="button" onclick="uploadFile()">上传</button>
</form>
<script>
function uploadFile() {
var formData = new FormData(document.getElementById("uploadForm"));
fetch("/upload", {
method: "POST",
body: formData,
})
.then((response) => response.json())
.then((data) => {
if (data.status === "ok") {
alert("文件上传成功!");
} else {
alert("文件上传失败:" + data.message);
}
})
.catch((error) => {
console.error("上传失败:", error);
});
}
</script>
</body>
</html>
在 HTML 页面中,创建一个表单uploadForm
,其中包含一个文件输入框file
和一个上传按钮。文件输入框的accept
属性设置为.xls,.xlsx
,表示只允许选择 Excel 文件。点击上传按钮时,会调用uploadFile
函数,该函数使用 JavaScript 的FormData
对象来构建表单数据,并通过fetch
API 发送 POST 请求到后端的/upload
接口。
觉得有用的话点个赞
👍🏻
呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙