点击下载《Java SpringBoot使用Apache POI导入导出Excel文件(源代码)》
1. Apache POI 简介
Apache POI 是一个强大的 Java 库,用于处理 Microsoft Office 文档,包括 Excel 文件(.xls 和 .xlsx)。在 Java Spring Boot 项目中,利用 Apache POI 可以方便地实现 Excel 文件的导入(读取)和导出(写入)功能。
1.1 Apache POI 的特点
特性 | 详细说明 |
---|---|
支持多种 Office 文档格式 | 包括 Excel(.xls 和 .xlsx)、Word、PowerPoint 等。 |
功能全面 | 支持 Excel 的各种复杂功能,如公式、图表、样式、单元格格式、数据验证、宏等。 |
丰富的 API | 提供了 HSSF(用于 .xls)、XSSF(用于 .xlsx)和 SXSSF(用于大数据量的 .xlsx)等不同的实现类,支持对 Excel 文件的细粒度控制。 |
社区活跃 | 作为 Apache 基金会项目,拥有活跃的社区和丰富的文档资源,便于开发者获取帮助和解决问题。 |
灵活性高 | 提供了丰富的配置选项和 API,开发者可以根据需要进行高度定制,满足复杂的业务需求。 |
支持读写操作 | 不仅支持读取 Excel 文件,还支持创建和修改 Excel 文件,包括添加、删除、修改单元格内容和格式。 |
1.2 Apache POI 的优点
优点 | 详细说明 |
---|---|
功能强大 | 能够处理 Excel 的各种高级功能,适用于需要全面操作 Excel 文件的场景。 |
广泛支持 | 支持多种 Office 文档格式,适用于不同的应用场景,如数据导入导出、报表生成等。 |
灵活性高 | 提供了丰富的 API 和配置选项,开发者可以根据具体需求进行定制,实现复杂的业务逻辑。 |
社区支持 | 作为开源项目,拥有活跃的社区和丰富的文档资源,便于开发者获取帮助和解决问题。 |
兼容性良好 | 与多种 Java 版本和框架兼容,能够很好地集成到现有的 Java 项目中。 |
1.3 Apache POI 的缺点
缺点 | 详细说明 |
---|---|
内存消耗大 | 处理大型 Excel 文件时,内存消耗较大,容易导致内存溢出(OutOfMemoryError)。特别是使用 HSSF 和 XSSF 时,这个问题尤为明显。 |
性能较低 | 相比于一些轻量级的库(如 EasyExcel),Apache POI 在处理大规模数据时的性能较低,处理时间较长。 |
复杂性较高 | 由于功能全面,API 较为复杂,学习曲线较陡,开发者需要花费更多时间学习和掌握。 |
文件体积较大 | 生成的 Excel 文件体积可能较大,特别是在包含大量数据或复杂格式时,可能会影响文件传输和存储效率。 |
部分功能不够完善 | 尽管功能全面,但在某些高级功能(如某些复杂的图表类型、宏支持等)上可能不如 Microsoft Office 本身的功能完善。 |
2. 实现 Excel 导入与导出
2.1 引用项目依赖
在 pom.xml
中添加 Apache POI 的依赖:
<dependencies>
<!-- Spring Boot Starter Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Apache POI 依赖 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
<!-- Lombok (可选,用于简化代码) -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- 其他依赖 -->
</dependencies>
2.2 定义数据模型
定义与 Excel 列对应的 Java 类:
package com.example.exceldemo;
import lombok.Data;
@Data
public class UserData {
private Integer id;
private String name;
private Integer age;
private String email;
}
2.3 Excel 导入导出Controller类
创建 ExcelController
类,包含导出和导入接口:
package com.example.exceldemo;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@RestController
public class ExcelController {
@GetMapping("/export")
public ResponseEntity<byte[]> exportExcel() {
String fileName = "用户数据.xlsx";
List<UserData> userList = generateUserData();
byte[] bytes = exportToExcel(userList);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentDispositionFormData("attachment", fileName);
return ResponseEntity.ok()
.headers(headers)
.body(bytes);
}
private List<UserData> generateUserData() {
List<UserData> list = new ArrayList<>();
for (int i = 1; i <= 100; i++) {
UserData user = new UserData();
user.setId(i);
user.setName("用户" + i);
user.setAge(20 + i % 30);
user.setEmail("user" + i + "@example.com");
list.add(user);
}
return list;
}
private byte[] exportToExcel(List<UserData> userList) {
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("用户数据");
// 创建表头
Row header = sheet.createRow(0);
header.createCell(0).setCellValue("编号");
header.createCell(1).setCellValue("姓名");
header.createCell(2).setCellValue("年龄");
header.createCell(3).setCellValue("邮箱");
// 写入数据
for (int i = 0; i < userList.size(); i++) {
Row row = sheet.createRow(i + 1);
UserData user = userList.get(i);
row.createCell(0).setCellValue(user.getId());
row.createCell(1).setCellValue(user.getName());
row.createCell(2).setCellValue(user.getAge());
row.createCell(3).setCellValue(user.getEmail());
}
// 写入到字节数组
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
workbook.write(out);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
workbook.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return out.toByteArray();
}
@PostMapping("/import")
public String importExcel(@RequestParam("file") MultipartFile file) {
try (InputStream inputStream = file.getInputStream()) {
List<UserData> userList = new ArrayList<>();
Workbook workbook = new XSSFWorkbook(inputStream);
Sheet sheet = workbook.getSheetAt(0);
Iterator<Row> iterator = sheet.iterator();
// 跳过表头
if (iterator.hasNext()) {
iterator.next();
}
while (iterator.hasNext()) {
Row row = iterator.next();
UserData user = new UserData();
user.setId((int) row.getCell(0).getNumericCellValue());
user.setName(row.getCell(1).getStringCellValue());
user.setAge((int) row.getCell(2).getNumericCellValue());
user.setEmail(row.getCell(3).getStringCellValue());
userList.add(user);
}
// 处理导入的数据,例如保存到数据库
processUserData(userList);
return "导入成功,共导入 " + userList.size() + " 条数据";
} catch (IOException e) {
e.printStackTrace();
return "导入失败: " + e.getMessage();
}
}
private void processUserData(List<UserData> userList) {
// 这里可以添加将数据保存到数据库的逻辑
// 例如使用 JPA 或 MyBatis 等持久层框架
userList.forEach(user -> {
// 模拟保存操作
System.out.println("保存用户: " + user);
});
}
}
2.4 前端部分(可选)
为了测试导入功能,可以创建一个简单的 HTML 表单:
<!DOCTYPE html>
<html>
<head>
<title>Excel 导入</title>
</head>
<body>
<h1>导入 Excel 文件</h1>
<form method="POST" enctype="multipart/form-data" action="/import">
<input type="file" name="file" accept=".xlsx, .xls" />
<button type="submit">上传</button>
</form>
</body>
</html>
将这个 HTML 文件放在 src/main/resources/static
目录下,例如 src/main/resources/static/import.html
,然后访问 http://localhost:8080/import.html
即可看到上传表单。
2.5 运行项目
-
1.启动 Spring Boot 应用。
-
2.访问
http://localhost:8080/import.html
。 -
3.点击“上传”按钮,选择包含用户数据的 Excel 文件进行导入。
结果如下:
-
4.访问
http://localhost:8080/export
,将下载一个包含示例用户数据的 Excel 文件。
3. 总结
Apache POI 是一个功能强大的 Java 库,适用于在 Spring Boot 项目中处理 Excel 文件的导入与导出。通过使用 Apache POI,开发者可以方便地实现对 Excel 文件的读写操作,包括处理复杂的 Excel 功能。然而,Apache POI 在处理大型文件时内存消耗较大,性能相对较低,因此在处理大规模数据时需要谨慎。
在本文中,我们详细介绍了如何使用 Apache POI 在 Spring Boot 中实现 Excel 文件的导入与导出,包括数据模型的定义、控制器接口的实现以及前后端交互的实现。通过本文的示例代码,大家可以快速上手并在实际项目中应用这些技术。
点击下载《Java SpringBoot使用Apache POI导入导出Excel文件(源代码)》