当前位置: 首页 > news >正文

Java 操作 Excel 全方位指南:从入门到避坑,基于 Apache POI

Java 操作 Excel 全方位指南:从入门到避坑,基于 Apache POI

在现代企业级应用开发中,与 Microsoft Excel 文件进行交互是一项极其常见的需求。无论是数据导出生成报表、批量导入数据到系统,还是解析用户上传的 Excel 模板,Java 开发者都需要一套强大而可靠的工具库。Apache POI 项目正是为此而生的事实标准。本文将深入探讨如何使用 Apache POI 的两个核心组件 poi-ooxmlpoi-ooxml-schemas,从原理到实战,为你全面解析 Java 操作 Excel 的方方面面。

一、依赖简介:POI、poi-ooxml 与 poi-ooxml-schemas

在开始编码之前,我们首先要理清 Apache POI 项目下的几个核心依赖及其关系。

1.1 Apache POI 项目概览

Apache POI(Poor Obfuscation Implementation)是一个开源的 Apache 项目,提供了一系列 Java API 来操作各种 Microsoft Office 格式文件,包括 Word、Excel、PowerPoint、Visio、Outlook 等。

对于 Excel 文件,POI 主要支持两种格式:

  • HSSF (Horrible SpreadSheet Format):用于操作 Excel 97(-2007) 的 .xls 格式。
  • XSSF (XML SpreadSheet Format)SXSSF (Streaming Usermodel for XSSF):用于操作 Excel 2007 OOXML (.xlsx) 及更高版本的格式。

1.2 核心依赖辨析

在我们的 pom.xml 中,通常会看到以下依赖:

<!-- 核心POI功能,包含HSSF用于操作旧的.xls格式 -->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.3</version> <!-- 请使用最新版本 -->
</dependency><!-- 用于操作新的.xlsx格式 (XSSF和SXSSF) -->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version> <!-- 请使用最新版本 -->
</dependency><!-- (通常自动传递依赖,无需显式声明) -->
<!-- <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>5.2.3</version>
</dependency> -->
  • poi:这是核心 Artifact,包含了操作所有 OLE2 格式文件(如 .xls, .doc)的类(如 HSSFWorkbook, HSSFSheet)。
  • poi-ooxml:这个依赖是本文的重点。它包含了操作 OOXML 格式文件(如 .xlsx, .docx)的类(如 XSSFWorkbook, XSSFSheet)。关键点在于:poi-ooxml 本身依赖于 poipoi-ooxml-schemas。所以你通常只需要声明 poi-ooxml 即可。
  • poi-ooxml-schemas:这个依赖包含了完整的 OOXML 架构定义(大量的 .xsd 文件)。它提供了 Excel 文件底层 XML 结构的 Java 映射。poi-ooxml 在运行时需要它来理解和生成符合规范的 .xlsx 文件。在绝大多数情况下,Maven/Gradle 的依赖传递机制会自动引入它,我们无需在 pom.xml 中显式声明。

总结:如果你只需要处理旧的 .xls 格式,引入 poi 即可;如果需要处理新的 .xlsx 格式,引入 poi-ooxml 就够了,它会自动帮你搞定其他依赖。

二、实战场景:生成一个复杂的 Excel 报表

让我们从一个真实的业务场景出发:将数据库中的用户信息列表导出为一个格式美观的 .xlsx 报表

假设我们有一个 User 实体类:

@Data // Lombok 注解
public class User {private Long id;private String username;private String email;private Integer age;private String department;private LocalDateTime createTime;
}

我们的目标是生成一个包含标题、表头、数据行和合计行的 Excel 文件,并设置一些简单的样式。

2.1 基础步骤:创建工作簿、工作表、行和单元格

所有操作都围绕 Workbook -> Sheet -> Row -> Cell 这个层次结构进行。

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.List;public class ExcelExporter {public void exportUsersToExcel(List<User> userList, String filePath) 

文章转载自:

http://uaohAG1A.rkfwr.cn
http://P6vixHrD.rkfwr.cn
http://jCxqi35h.rkfwr.cn
http://HVKGEh8m.rkfwr.cn
http://qVuudXeW.rkfwr.cn
http://WprShSPB.rkfwr.cn
http://w193smRt.rkfwr.cn
http://vY3BUCxX.rkfwr.cn
http://Xl1EC4lu.rkfwr.cn
http://dSMuwzlu.rkfwr.cn
http://ltdXcmn0.rkfwr.cn
http://q8zHUbjh.rkfwr.cn
http://pGHe5oP0.rkfwr.cn
http://bHS6JLAK.rkfwr.cn
http://UPre6puC.rkfwr.cn
http://8999T2Od.rkfwr.cn
http://lxS6ioDv.rkfwr.cn
http://jnXnMu1b.rkfwr.cn
http://v9WqnZMT.rkfwr.cn
http://RFaogjR1.rkfwr.cn
http://fYYtqAlJ.rkfwr.cn
http://eWrQTGRM.rkfwr.cn
http://yAhRqAWQ.rkfwr.cn
http://G9z3XISZ.rkfwr.cn
http://A2IHRePd.rkfwr.cn
http://wnoeCJdq.rkfwr.cn
http://loc8Km0m.rkfwr.cn
http://0mYmLKg0.rkfwr.cn
http://ZIaPWWOK.rkfwr.cn
http://m2nXxZda.rkfwr.cn
http://www.dtcms.com/a/368226.html

相关文章:

  • 多云战略的悖论:为何全局数据“看得见”却“算不起”?
  • 深入剖析Spring动态代理:揭秘JDK动态代理如何精确路由接口方法调用
  • More Effective C++ 条款29:引用计数
  • 人形机器人控制系统核心芯片从SoC到ASIC的进化路径
  • Docker学习笔记(三):镜像与容器管理进阶操作
  • excel里面店铺这一列的数据结构是2C【uniteasone17】这种,我想只保留前面的2C部分,后面的【uniteasone17】不要
  • Qt图片资源导入
  • 苍穹外卖Day10 | 订单状态定时处理、来单提醒、客户催单、SpringTask、WebSocket、cron表达式
  • 01-Hadoop简介与生态系统
  • 如何利用静态代理IP优化爬虫策略?从基础到实战的完整指南
  • 信息安全工程师考点-网络信息安全概述
  • 功能强大的多线程端口扫描工具,支持批量 IP 扫描、多种端口格式输入、扫描结果美化导出,适用于网络安全检测与端口监控场景
  • 自定义格式化数据(BYOFD)(81)
  • 人工智能时代职能科室降本增效KPI设定全流程与思路考察
  • 使用 chromedp 高效爬取 Bing 搜索结果
  • Linux 命令速查宝典:从入门到高效操作
  • 【科研绘图系列】R语言绘制论文合集图
  • 分类、目标检测、实例分割的评估指标
  • 卷积神经网络进行图像分类
  • Java JVM核心原理与面试题解析
  • 【Flutter】RefreshIndicator 无法下拉刷新问题
  • 基于Django+Vue3+YOLO的智能气象检测系统
  • Flutter的三棵树
  • React 样式隔离核心方法和最佳实践
  • 踩坑实录:Django继承AbstractUser时遇到的related_name冲突及解决方案
  • 【Flutter】flutter_local_notifications并发下载任务通知实践
  • 覆盖Transformer、GAN:掩码重建正在重塑时间序列领域!
  • 数据结构基础之队列:数组/链表
  • 数据可视化工具推荐:5款让图表制作轻松上手的神器
  • 【网安基础】--ip地址与子网掩码