Apache POI 5.5.1 常用工具与 API 详解
Apache POI 5.5.1 常用工具与 API 详解:说明 POI 为纯 jar 类库无独立命令行工具、需经 Maven 引入后以 Java 代码调用,逐类速查 Workbook/XSSFWorkbook、Sheet、Row、Cell、DataFormatter、OPCPackage 核心 API 及依赖 jar 清单(13 个)与 mvn/unzip 辅助命令,含代码示例、真实回显与 FAQ,全程实测。
Apache POI 5.5.1 常用工具与 API 详解
目标:详解 Apache POI 5.5.1 的核心 API 与配套工具使用。POI 本身没有独立命令行工具,需通过 Java 代码调用其 jar 完成文档读写。本文按类速查
Workbook/XSSFWorkbook/Sheet/Row/Cell/DataFormatter等关键类,给出依赖 jar 清单(13 个)、mvn/unzip辅助命令、代码示例与 FAQ。所有示例在 Ubuntu 22.04.5 + OpenJDK 17 环境实测。
一、环境信息
- 操作系统:Ubuntu 22.04.5 LTS
- Java:OpenJDK 17.0.20.1(headless)
- 构建工具:Apache Maven 3.6.3
- POI 版本:5.5.1(poi-ooxml 入口,传递 13 个 jar)
- 示例工程:
/opt/data/poi-demo/ - 产物文件:
/tmp/demo.xlsx(3379 bytes) - 运行账号:
root
二、工具概览
POI 以「类库 + jar」形态提供,没有 poi 命令行可执行程序;对 Excel/Word/PowerPoint 的全部操作都通过 Java API 完成。实际使用方式是把 jar 放进 classpath(Maven 依赖或 -cp),在自己的 Java 类中调用核心类:
| 工具/API 类别 | 代表类 | 作用 |
|---|---|---|
| 工作簿 | Workbook、XSSFWorkbook | 文档总入口:建表、写文件、读文件 |
| 工作表/行/单元格 | Sheet、Row、Cell | 三级结构定位与取值 |
| 格式化读取 | DataFormatter | 按显示格式把单元格转为字符串 |
| 打包访问 | OPCPackage | OOXML 打包文件的底层访问入口 |
| 构建辅助 | mvn(dependency:tree / build-classpath) | 核对依赖树、生成运行 classpath |
| 结构查看 | unzip -l、ls -l | 查看 xlsx 的 ZIP 内部结构与文件大小 |
💡 说明:POI 同时提供 HSSF(处理 .xls,OLE2 二进制格式)与 XSSF(处理 .xlsx,OOXML 格式)两套实现;本批实测以 XSSF 的 .xlsx 读写为准。
三、前置条件
已安装 JDK 17 与 Maven,并已建立最小工程、能正常编译运行(工程建立与依赖引入见《Apache POI 5.5.1 构建并运行示例应用指南》):
cd /opt/data/poi-demo && mvn -q package
退出码 0 即构建成功。
四、核心 API 详解
4.1 Workbook 与 XSSFWorkbook(工作簿)
Workbook 是接口,XSSFWorkbook 是其 .xlsx 实现。写入用 try-with-resources 创建后经 write(OutputStream) 落盘;读取用输入流直接构造:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.FileOutputStream;
// 写:内存创建工作簿并写出
try (Workbook wb = new XSSFWorkbook()) {
Sheet sheet = wb.createSheet("Demo");
try (FileOutputStream fos = new FileOutputStream("/tmp/demo.xlsx")) {
wb.write(fos);
}
}
// 读:输入流构造工作簿
try (FileInputStream fis = new FileInputStream("/tmp/demo.xlsx");
Workbook wb = new XSSFWorkbook(fis)) {
int count = wb.getNumberOfSheets();
}
常用方法:
| 方法 | 说明 |
|---|---|
createSheet(String) | 创建工作表并命名 |
getSheetAt(int) | 按序号取工作表(0 起) |
getSheetName(int) | 按序号取工作表名 |
getNumberOfSheets() | 工作表总数 |
write(OutputStream) | 把工作簿写出为 .xlsx 文件 |
close() | 释放资源(try-with-resources 自动调用) |
4.2 Sheet / Row / Cell(工作表/行/单元格)
三级结构逐层创建与遍历,行号、列号均从 0 起:
Sheet sheet = wb.getSheetAt(0);
Row row = sheet.createRow(1); // 按行号创建行
Cell cell = row.createCell(0); // 按列号创建单元格
cell.setCellValue("Hello POI"); // 写字符串
row.createCell(1).setCellValue(42); // 写数值(int/double)
// 遍历:Sheet 可直接迭代 Row,Row 可直接迭代 Cell
for (Row r : sheet) {
for (Cell c : r) {
int rowNum = r.getRowNum(); // 行号
int colIdx = c.getColumnIndex(); // 列号
}
}
| 类/方法 | 说明 |
|---|---|
Sheet.createRow(int) | 按行号创建行 |
Row.createCell(int) | 按列号创建单元格 |
Cell.setCellValue(String/double/boolean) | 写入对应类型的值 |
Row.getRowNum() / Cell.getColumnIndex() | 行号/列号(0 起) |
for (Row r : sheet) | Iterable 遍历,无需按下标取行 |
4.3 DataFormatter(格式化读取)
直接读 Cell 原始值需要区分 CellType;DataFormatter.formatCellValue(Cell) 按单元格显示格式统一输出字符串,实测数字 42、3.14 均按原样打印:
DataFormatter fmt = new DataFormatter();
String val = fmt.formatCellValue(c);
System.out.printf("[READ] R%dC%d = %s%n",
r.getRowNum(), c.getColumnIndex(), val);
| 方法 | 说明 |
|---|---|
formatCellValue(Cell) | 按显示格式取字符串(推荐读取方式) |
new DataFormatter() | 无参构造,默认按单元格样式格式化 |
4.4 OPCPackage 与读取方式
.xlsx 本质是 ZIP 打包的 OOXML 文档,OPCPackage 是其底层打包访问入口。常用读取方式对比:
| 方式 | 形态 | 适用 |
|---|---|---|
new XSSFWorkbook(FileInputStream) | 整本载入堆 | 小文件(本批实测方式) |
new XSSFWorkbook(OPCPackage) | 打包句柄可控 | 中等文件 |
| SAX 事件解析 | 流式读取 | 大文件,避免整本载入内存 |
⚠️
OPCPackage构造与 SAX 事件解析两种方式未在本次实测范围,选择依据来自官方使用建议。
4.5 依赖 jar 清单与辅助命令工具
依赖 jar 清单:最小工程 compile classpath 共 13 个 jar,均位于 ~/.m2/repository:
| jar | 版本 | 大小 |
|---|---|---|
| poi | 5.5.1 | 2.9M |
| poi-ooxml | 5.5.1 | 2.0M |
| poi-ooxml-lite | 5.5.1 | 5.8M |
| xmlbeans | 5.3.0 | 2.2M |
| commons-compress | 1.28.0 | 1.1M |
| commons-lang3 | 3.18.0 | 688K |
| commons-io | 2.21.0 | 572K |
| commons-codec | 1.20.0 | 392K |
| log4j-api | 2.24.3 | 344K |
| curvesapi | 1.08 | 116K |
| commons-math3 | 3.6.1 | 2.2M |
| commons-collections4 | 4.5.0 | 见 ~/.m2 |
| SparseBitSet | 1.3 | 28K |
核对依赖树(mvn dependency:tree,输出即上表 jar 的组合关系):
cd /opt/data/poi-demo && mvn dependency:tree -Dscope=compile
真实回显:
com.example:poi-demo:jar:1.0
\- org.apache.poi:poi-ooxml:jar:5.5.1:compile
+- org.apache.poi:poi:jar:5.5.1:compile
| +- commons-codec:commons-codec:jar:1.20.0:compile
| +- org.apache.commons:commons-math3:jar:3.6.1:compile
| \- com.zaxxer:SparseBitSet:jar:1.3:compile
+- org.apache.poi:poi-ooxml-lite:jar:5.5.1:compile
+- org.apache.xmlbeans:xmlbeans:jar:5.3.0:compile
+- org.apache.commons:commons-compress:jar:1.28.0:compile
| \- org.apache.commons:commons-lang3:jar:3.18.0:compile
+- commons-io:commons-io:jar:2.21.0:compile
+- com.github.virtuald:curvesapi:jar:1.08:compile
+- org.apache.logging.log4j:log4j-api:jar:2.24.3:compile
\- org.apache.commons:commons-collections4:jar:4.5.0:compile
生成运行 classpath(依赖 jar 路径写入 cp.txt,供 java -cp 直接使用):
cd /opt/data/poi-demo && mvn -q dependency:build-classpath -Dmdep.outputFile=/opt/data/poi-demo/cp.txt
命令本身无控制台输出;执行后 cat /opt/data/poi-demo/cp.txt 的内容即上表 13 个 jar 的绝对路径列表(冒号分隔)。
查看 xlsx 内部结构(ZIP 视角验证产物):
ls -l /tmp/demo.xlsx
unzip -l /tmp/demo.xlsx
真实回显:
-rw-r--r-- 1 root root 3379 Oct 11 11:27 /tmp/demo.xlsx # 3379 bytes ≈ 3.3 KB
Archive: /tmp/demo.xlsx
Length Date Time Name
--------- ---------- ----- ----
1053 2026-10-11 11:27 [Content_Types].xml
586 2026-10-11 11:27 _rels/.rels
183 2026-10-11 11:27 docProps/app.xml
433 2026-10-11 11:27 docProps/core.xml
237 2026-10-11 11:27 xl/sharedStrings.xml
674 2026-10-11 11:27 xl/styles.xml
347 2026-10-11 11:27 xl/workbook.xml
564 2026-10-11 11:27 xl/_rels/workbook.xml.rels
639 2026-10-11 11:27 xl/worksheets/sheet1.xml
--------- -------
4716 9 files
五、完整最小可运行示例
把上述 API 串成一次"写入 + 读回"的完整程序(对应《Apache POI 5.5.1 构建并运行示例应用指南》篇的可执行源码),核心调用如下:
String path = "/tmp/demo.xlsx";
// 写:内存创建工作簿 → 建表/建行/建格 → 写出
try (Workbook wb = new XSSFWorkbook()) {
Sheet sheet = wb.createSheet("Demo");
Row header = sheet.createRow(0);
header.createCell(0).setCellValue("Name");
header.createCell(1).setCellValue("Value");
Row row = sheet.createRow(1);
row.createCell(0).setCellValue("Hello POI");
row.createCell(1).setCellValue(42);
Row row2 = sheet.createRow(2);
row2.createCell(0).setCellValue("中国-测试");
row2.createCell(1).setCellValue(3.14);
try (FileOutputStream fos = new FileOutputStream(path)) {
wb.write(fos);
}
}
// 读:输入流构造工作簿 → DataFormatter 逐格打印
try (FileInputStream fis = new FileInputStream(path);
Workbook wb = new XSSFWorkbook(fis)) {
Sheet sheet = wb.getSheetAt(0);
for (Row r : sheet) {
for (Cell c : r) {
DataFormatter fmt = new DataFormatter();
String val = fmt.formatCellValue(c);
System.out.printf("[READ] R%dC%d = %s%n",
r.getRowNum(), c.getColumnIndex(), val);
}
}
}
运行实测输出(java -Dfile.encoding=UTF-8 -cp "target/classes:$(cat cp.txt)" PoiXlsxDemo,退出码 0):
2026-10-11T11:27:04.652091124Z main ERROR Log4j API could not find a logging provider.
[WRITE] 已写出文件: /tmp/demo.xlsx, 大小=3379 bytes (=3.3 KB)
[READ] Sheet count=1, first sheet name="Demo"
[READ] R0C0 = Name
[READ] R0C1 = Value
[READ] R1C0 = Hello POI
[READ] R1C1 = 42
[READ] R2C0 = 中国-测试
[READ] R2C1 = 3.14
[DONE] 写读演示完成
💡 首行 Log4j 警告为 classpath 中仅有
log4j-api(无实现)时的常规提示,不影响功能。
六、注意事项
⚠️ 注意:
- POI 没有
poi命令行工具,必须通过 Java 代码引入 jar 调用;mvn/unzip/ls仅是构建与结构查看的辅助命令。- POI 5.5.x 需 JDK 8+;写入与读取务必使用同一套 Workbook 实现(本文均为 XSSF/.xlsx)。
poi-ooxml-lite随poi-ooxml传递引入即可满足常规读写;需要冷门 schema 类型时才考虑poi-ooxml-full(未实测)。- 大文件读取优先 SAX 事件解析,避免 XSSFWorkbook 整本载入堆内存(未在本次实测范围)。
七、常见问题
Q1:POI 有命令行工具吗?
没有。POI 是 Java 类库,全部操作经 Java API 完成;命令行侧只有构建工具 mvn 与系统辅助命令(unzip -l 查看包结构等)。
Q2:java -cp 报 ClassNotFoundException?
确认已执行 mvn -q package 生成 target/classes,且 classpath 形如 "target/classes:$(cat cp.txt)"(先主类目录、后依赖列表,Linux 分隔符为冒号)。
Q3:读数字单元格得到浮点数(42.0)而不是 42?
Cell.getNumericCellValue() 返回 double。用 DataFormatter.formatCellValue(Cell) 按显示格式取字符串,实测输出即为 42。
Q4:写出的文件打不开或报 ZIP 异常?
write(OutputStream) 必须在 Workbook 关闭前完成且流正常关闭;推荐 try-with-resources 包裹 Workbook 与输出流,保证写出完整。
八、参考链接
- Apache POI 官网:
https://poi.apache.org/ - Apache POI 官方发布说明:
https://dlcdn.apache.org/poi/release/RELEASE-NOTES.txt - Maven Central poi-ooxml 版本目录:
https://repo1.maven.org/maven2/org/apache/poi/poi-ooxml/