点击下载《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文件(源代码)》