SpringBoot使用Apache POI实现导入导出Excel文件

 更新时间:2025年01月08日 10:09:42   作者:孤蓬&听雨  
Apache POI 是一个强大的 Java 库,用于处理 Microsoft Office 文档,下面我们来看看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的资料请关注脚本之家其它相关文章!

相关文章

  • 新版idea创建spring boot项目的详细教程

    新版idea创建spring boot项目的详细教程

    这篇文章给大家介绍了新版idea创建spring boot项目的详细教程,本教程对新手小白友好,若根据教程创建出现问题导致失败可下载我提供的源码,在文章最后,本教程较新,文中通过图文给大家介绍的非常详细,感兴趣的朋友可以参考下
    2024-01-01
  • 使用MybatisPlus自定义模版中能获取到的信息

    使用MybatisPlus自定义模版中能获取到的信息

    这篇文章主要介绍了使用MybatisPlus自定义模版中能获取到的信息,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • Idea里github的图形化操作配置方法

    Idea里github的图形化操作配置方法

    这篇文章主要介绍了Idea里github的图形化操作配置方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • Springboot 读取 yml 配置文件里的参数值

    Springboot 读取 yml 配置文件里的参数值

    本文主要介绍了Springboot 读取 yml 配置文件里的参数值,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • Java实现合并两个有序序列算法示例

    Java实现合并两个有序序列算法示例

    这篇文章主要介绍了Java实现合并两个有序序列算法,简单描述了序列合并算法的原理与java合并有序序列的具体操作步骤及相关实现技巧,需要的朋友可以参考下
    2017-09-09
  • Springboot整合Swagger2后访问swagger-ui.html 404报错问题解决方案

    Springboot整合Swagger2后访问swagger-ui.html 404报错问题解决方案

    这篇文章主要介绍了Springboot整合Swagger2后访问swagger-ui.html 404报错,本文给大家分享两种解决方案,结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • 基于Java+SSM实现电影院购票系统

    基于Java+SSM实现电影院购票系统

    今天小编给大家带来一款SSM的电影院售票系统,非常不错的一个项目,是学习​javaweb编程必备。文中的示例代码讲解详细,需要的可以参考一下
    2022-04-04
  • Java项目--家庭收支记录程序

    Java项目--家庭收支记录程序

    本文主要介绍Java基础阶段的一个小项目——家庭收支记录程序(附完整源代码),本项目所用到的主要知识点:基本语法、数组和方法。本项目并不难,主要是对Java初学者的基础综合运用的训练及检验
    2021-07-07
  • Java中的CyclicBarrier循环栅栏解析

    Java中的CyclicBarrier循环栅栏解析

    这篇文章主要介绍了Java中的CyclicBarrier循环栅栏解析,从字面上的意思可以知道,这个类的中文意思是"循环栅栏",大概的意思就是一个可循环利用的屏障,它的作用就是会让所有线程都等待完成后才会继续下一步行动,需要的朋友可以参考下
    2023-12-12
  • dependencies导致的Maven依赖出错包红问题解决方法

    dependencies导致的Maven依赖出错包红问题解决方法

    多模块和分布式开发一般都是有专门的的dependencies来进行jar包的版本依赖问题,本文主要介绍了dependencies导致的Maven依赖出错包红问题解决方法,具有一定的参考价值,感兴趣的可以了解一下
    2022-05-05

最新评论