Java SpringBoot使用Apache POI导入导出Excel文件

点击下载《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 的依赖:

xml 复制代码
<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 类:

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 类,包含导出和导入接口:

java 复制代码
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 表单:

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. 1.启动 Spring Boot 应用

  2. 2.访问 http://localhost:8080/import.html

  3. 3.点击"上传"按钮 ,选择包含用户数据的 Excel 文件进行导入。

    结果如下:

  4. 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文件(源代码)》

相关推荐
martian6658 分钟前
【Java高级篇】——第16篇:高性能Java应用优化与调优
java·开发语言·jvm
m0_748247558 分钟前
springboot中配置logback-spring.xml
spring boot·spring·logback
m0_7482500310 分钟前
springboot使用logback自定义日志
java·spring boot·logback
程序猿熊跃晖13 分钟前
多环境日志管理:使用Logback与Logstash集成实现高效日志处理
spring boot·elk·logback
-优势在我13 分钟前
Android TabLayout 实现随意控制item之间的间距
android·java·ui
Lojarro28 分钟前
JavaEE基础之- Servlet相关
java·servlet·java-ee
KingDol_MIni1 小时前
Spring Boot 集成 T-io 实现客户端服务器通信
java·服务器·spring boot
许苑向上1 小时前
Java八股文(下)
java·开发语言
后端码匠1 小时前
Spring Boot3+Vue2极速整合:10分钟搭建DeepSeek AI对话系统
人工智能·spring boot·后端
逸Y 仙X1 小时前
Git常见命令--助力开发
java·大数据·git·java-ee·github·idea