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 的依赖:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/891867.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 macOS 中,设置自动将文件夹排在最前

文章目录 1、第一步访达设置2、第二步排序方式 需要两步设置 1、第一步访达设置 按名称排序的窗口中 2、第二步排序方式 选择名称

汇编环境搭建

学习视频 将MASM所在目录 指定为C盘

Sentinel-5P遥感数据下载及预处理教程【20250105】

Sentinel-5P是欧空局&#xff08;Europe Space Agency&#xff0c;ESA&#xff09;于2017年10月13日发射的一颗全球大气污染监测卫星。卫星搭载了对流层观测仪&#xff08;Tropospheric Monitoring Instrument&#xff0c;TROPOMI&#xff09;&#xff0c;可以有效的观测全球各…

32单片机从入门到精通之软件编程——任务调度(十)

无论是在学习、工作还是生活中&#xff0c;我们都会遇到各种困难和挑战。然而&#xff0c;成功的人并不是没有困难和挑战&#xff0c;而是他们能够勇敢面对困难和挑战&#xff0c;并从中汲取力量和经验。他们相信自己的能力&#xff0c;从不轻易放弃。他们知道&#xff0c;只有…

java项目之高校心理教育辅导系统的设计与实现(springboot+mybatis+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的闲一品交易平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 高校心理教育辅导系统的设…

打造三甲医院人工智能矩阵新引擎(一):文本大模型篇--基于GPT-4o的探索

一、引言 当今时代,人工智能技术正以前所未有的速度蓬勃发展,深刻且广泛地渗透至各个领域,医疗行业更是这场变革的前沿阵地。在人口老龄化加剧、慢性疾病患病率上升以及人们对健康需求日益增长的大背景下,三甲医院作为医疗体系的核心力量,承担着极为繁重且复杂的医疗任务。…

美的空气净化器好用吗?拾梧、美的、戴森空气净化器除烟哪个好?

说到二手烟&#xff0c;这可真是个让人头疼的问题&#xff01;它里面含有超过7000种化学物质&#xff0c;形式多样&#xff0c;处理起来比甲醛这些传统污染物难多了。在市场上那么多空气净化器里&#xff0c;要挑一个能真正对付二手烟的&#xff0c;简直就像大海捞针一样难。不…

WebRtc01:课程导学、框架介绍

应用 难点 课程大纲 学习收获 涉及内容 概述 用途 学习收获

无法定位软件包cuda

无法定位软件包cuda 如果你在使用 sudo apt install cuda 命令安装 CUDA 时遇到“无法定位软件包cuda”的问题&#xff0c;这可能是由于你的系统没有正确配置 CUDA 的安装源。以下是一些可能的解决方案&#xff1a; 更新 Ubuntu 软件源并升级到最新版本的软件包。你可以选择使…

电脑steam api dll缺失了怎么办?

电脑故障解析与自救指南&#xff1a;Steam API DLL缺失问题的全面解析 在软件开发与电脑维护的广阔天地里&#xff0c;我们时常会遇到各种各样的系统报错与文件问题&#xff0c;其中“Steam API DLL缺失”便是让不少游戏爱好者和游戏开发者头疼的难题之一。作为一名深耕软件开…

关系数据库查询与优化

关系数据库查询与优化 (1)查询所有没发表过文章的用户名(2)查询得票数大于100的所有文章标题,按得票数倒序排列(3)查询发表文章数大于5,文章平均得票数大于100的用户名,按平均得票数倒序排列(4)表的主键、外键和索引设计(5)大数据量下的存储及性能优化在关系数据库…

【Android项目学习】3. MVVMHabit

项目链接 文章目录 一. 项目结构1. 项目整体划分2. 模块细分 二. Android知识点学习1. registerActivityLifecycleCallbacks方法2. 一. 项目结构 1. 项目整体划分 MVVMHabit是以谷歌DataBindingLiveDataViewModel框架为基础&#xff0c;整合OkhttpRxJavaRetrofitGlide等流行…

leetcode 面试经典 150 题:同构字符串

链接同构字符串题序号205题型字符串解法哈希表难度简单熟练度✅✅✅✅ 题目 给定两个字符串 s 和 t &#xff0c;判断它们是否是同构的。 如果 s 中的字符可以按某种映射关系替换得到 t &#xff0c;那么这两个字符串是同构的。 每个出现的字符都应当映射到另一个字符&#…

GPU算力平台的应用之任意门:任意穿搭匹配模型的应用教程

大家好&#xff0c;今天给大家介绍一下&#xff1a;GPU算力平台的应用之任意门:任意穿搭匹配模型的应用教程。 文章目录 一、GPU算力平台概述人工智能智能发展为什么需要GPU算力平台 二、注册与登录账号注册流程 三、平台的应用之Anydoor应用启动器选择Anydoor的应用场景Anydoo…

项目优化之策略模式

目录 策略模式基本概念 策略模式的应用场景 实际项目中具体应用 项目背景&#xff1a; 策略模式解决方案&#xff1a; 计费模块策略模式简要代码 策略模式基本概念 策略模式(Strategy Pattern) 是一种行为型设计模式&#xff0c;把算法的使用放到环境类中&#xff0c;而算…

学习虚幻C++开发日志——创建Selection Widget及其应用

教程视频&#xff1a;脚本冒险 - YouTube 前提&#xff1a;此代码运用到Common UI插件&#xff0c;需将其开启&#xff0c;以免后序编写产生未定义结构体的报错信息&#xff01; 用C进行UI绑定 创建继承于CommonUserWidget的类&#xff0c;此处命名为SelectionBase Select…

Linux(Centos 7.6)命令详解:pwd

1.命令作用 显示当前工作目录的完整路径(Print Working Directory) 2.命令语法 Usage: pwd [-LP] 3.参数详解 -L&#xff0c;显示逻辑路径&#xff0c;遵循符号链接&#xff1b;这是默认选项。-P&#xff0c;显示物理路径&#xff0c;不遵循符号链接。 4.常用用例 1.-L参…

Kafka中的Topic和Partition有什么关系?

大家好&#xff0c;我是锋哥。今天分享关于【Kafka中的Topic和Partition有什么关系&#xff1f;】面试题。希望对大家有帮助&#xff1b; Kafka中的Topic和Partition有什么关系&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Apache Kafka 中&#…

SpringBoot Maven 项目 pom 中的 plugin 插件用法整理

把 SpringBoot Maven 项目打包成 jar 文件时&#xff0c;我们通常用到 spring-boot-maven-plugin 插件。 前面也介绍过&#xff0c;在 spring-boot-starter-parent POM 和 spring-boot-starter POM 中都有插件的管理&#xff0c;现在我们就撸一把构建元素中插件的用法。 一、…

SpringBoot | 使用Apache POI库读取Excel文件介绍

关注WX&#xff1a;CodingTechWork 介绍 在日常开发中&#xff0c;我们经常需要处理Excel文件中的数据。无论是从数据库导入数据、处理数据报表&#xff0c;还是批量生成数据&#xff0c;都可能会遇到需要读取和操作Excel文件的场景。本文将详细介绍如何使用Java中的Apache PO…