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 文件的导入与导出,包括数据模型的定义、控制器接口的实现以及前后端交互的实现。通过本文的示例代码,大家可以快速上手并在实际项目中应用这些技术。
以上就是SpringBoot使用Apache POI实现导入导出Excel文件的详细内容,更多关于SpringBoot Apache POI导入导出Excel的资料请关注脚本之家其它相关文章!