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

相关推荐
ThetaarSofVenice9 分钟前
【Java从入门到放弃 之 final 关键字】
java·开发语言·python
赔罪18 分钟前
Java 内部类与异常类
java·开发语言·intellij-idea·myeclipse
凌寒ᨐ舞23 分钟前
idea 运行 docker-compose 文件问题
java·docker·intellij-idea
静心观复30 分钟前
Java NIO、AIO分析
java·开发语言·nio
静心观复30 分钟前
java IO 与 BIO、NIO、AIO
java·nio
袁庭新33 分钟前
什么是Lua协同程序?和线程有什么区别?
java·开发语言·lua·脚本语言·袁庭新·什么是lua协同程序·lua协同程序
程序员小杰@34 分钟前
Java的 BIO、NIO、AIO?分别的作用和用法
java·python·nio
一丝晨光34 分钟前
如何很快将文件转换成另外一种编码格式?编码?按指定编码格式编译?如何检测文件编码格式?Java .class文件编码和JVM运行期内存编码?
java·c++·python·visual studio·unicode·ansi·utf8
喜欢小苹果的码农1 小时前
javaCV音频剪切
java·音视频
北京_宏哥1 小时前
《手把手教你》系列技巧篇(十七)-java+ selenium自动化测试-元素定位大法之By css上卷(详细教程)
java·selenium·前端框架