5708 字
约 19 分钟
0
Apache POI 入门详解:Java 操作 Excel、Word 从零开始

Apache POI 入门详解:Java 操作 Excel、Word 从零开始

前言

在 Java 后端开发中,我们经常会遇到这样的需求:

导出订单 Excel

导入用户 Excel

生成财务报表

读取 Excel 数据

根据模板生成 Word 合同

提取 Word 文档内容和格式

自动生成报告

例如:

用户点击“导出订单”
        ↓
Java 查询 MySQL
        ↓
获得订单数据
        ↓
生成 Excel
        ↓
浏览器下载

或者:

用户上传 Excel
        ↓
Java 读取文件
        ↓
解析每一行
        ↓
数据校验
        ↓
保存数据库

再比如:

数据库
   ↓
查询合同信息
   ↓
填充 Word 模板
   ↓
生成合同.docx

这些场景中,一个非常经典的 Java 技术就是:

Apache POI

先用一句话理解:

Apache POI 是 Apache 提供的一套 Java Office 文档处理库,可以通过 Java 创建、读取、修改 Excel、Word、PowerPoint 等 Microsoft Office 文件。

截至 2026 年 9 月,Apache POI 官方最新稳定版本为 5.5.1。(Apache POI )


一、Apache POI 到底是什么?

POI 是一个 Java Library。

也就是说:

Apache POI
   ↓
Java 程序
   ↓
Office 文件

它并不是:

数据库

服务器

中间件

注册中心

微服务组件

而是一套:

Java API

用于操作 Office 文件。

例如:

Workbook workbook = new XSSFWorkbook();

意思就是:

在 Java 内存中创建一个 Excel 工作簿。

然后:

Sheet sheet = workbook.createSheet("用户");

创建一个 Sheet。

接着:

Row row = sheet.createRow(0);

创建一行。

再:

Cell cell = row.createCell(0);

创建一个单元格。

最后:

cell.setCellValue("张三");

往单元格写入:

张三

所以 Apache POI 做的事情其实非常直观:

把 Office 文档中的各种结构,映射成 Java 对象。


二、POI 能操作什么文件?

Apache POI 不只是 Excel。

官方组件包含对多种 Microsoft Office 文件格式的支持。(Apache POI )

例如:

文件 格式 POI 组件
Excel .xls HSSF
Excel .xlsx XSSF
Word .doc HWPF
Word .docx XWPF
PowerPoint .ppt HSLF
PowerPoint .pptx XSLF
Outlook .msg HSMF
Visio .vsd/.vsdx HDGF/XDGF

对于普通 Java 后端来说,最重要的是:

Excel
+
Word

尤其是 Excel。


三、学习 POI 首先要分清这几个东西

刚接触 POI 时最容易被:

HSSF
XSSF
SXSSF
HWPF
XWPF

搞懵。

其实一点都不复杂。

先记:

Excel
│
├── HSSF
│     ↓
│    .xls
│
├── XSSF
│     ↓
│    .xlsx
│
└── SXSSF
      ↓
     大数据量 .xlsx 写出


Word
│
├── HWPF
│     ↓
│    .doc
│
└── XWPF
      ↓
     .docx

这一张图基本解决 POI 一半的概念问题。


四、HSSF 是什么?

HSSF:

Horrible Spreadsheet Format

主要用于处理老版本 Excel:

.xls

也就是 Excel 97-2003 时代的二进制格式。

官方当前说明中,HSSF 对应 Excel 97 系列旧格式。(Apache POI )

创建:

HSSFWorkbook workbook = new HSSFWorkbook();

看到:

HSSF

脑子里就想到:

.xls

即可。


五、XSSF 是什么?

XSSF 主要操作现代 Excel:

.xlsx

也就是 Excel 2007 以后常见的 OOXML 格式。

Apache POI 官方将 XSSF 定义为 Excel 2007 OOXML .xlsx 格式的 Java 实现。(Apache POI )

创建:

XSSFWorkbook workbook = new XSSFWorkbook();

现在绝大多数新项目导出的 Excel,通常都是:

.xlsx

所以实际项目中:

XSSF 比 HSSF 更常见。


六、SXSSF 又是什么?

这个非常重要。

假设我们生成:

100 行 Excel

XSSF 完全没问题。

甚至:

10000 行

很多场景也可以。

但如果:

50 万行

100 万行

就必须开始考虑:

内存

因为 XSSF 在处理大型 Workbook 时,会在内存中维护大量对象。

可能出现:

大量数据
   ↓
大量 Row / Cell
   ↓
Heap 不断增长
   ↓
频繁 GC
   ↓
Full GC
   ↓
OOM

所以 POI 提供:

SXSSF

SXSSF 是建立在 XSSF 之上的低内存流式写出 API,它通过只保留有限数量的行在内存中,并将更早的数据写到磁盘,从而降低大型 Excel 生成时的堆内存占用。(Apache POI )

例如:

SXSSFWorkbook workbook = new SXSSFWorkbook(100);

可以粗略理解:

内存中主要保留最近 100 行

更早的行逐步刷到磁盘临时文件。

所以:

普通 Excel
↓
XSSF

超大 Excel 导出
↓
SXSSF

七、Excel 的核心对象模型

学习 POI 操作 Excel,最重要的是理解:

Workbook
Sheet
Row
Cell

它们与 Excel 的关系:

Workbook
   ↓
整个 Excel 文件

Sheet
   ↓
一个工作表

Row
   ↓
一行

Cell
   ↓
一个单元格

例如 Excel:

用户信息.xlsx

Sheet:用户

┌────┬────────┬──────┐
│ ID │ 姓名   │ 年龄 │
├────┼────────┼──────┤
│ 1  │ 张三   │ 25   │
├────┼────────┼──────┤
│ 2  │ 李四   │ 30   │
└────┴────────┴──────┘

POI 中就是:

Workbook
│
└── Sheet
     │
     ├── Row0
     │    ├── Cell0 = ID
     │    ├── Cell1 = 姓名
     │    └── Cell2 = 年龄
     │
     ├── Row1
     │    ├── Cell0 = 1
     │    ├── Cell1 = 张三
     │    └── Cell2 = 25
     │
     └── Row2

这就是整个 Excel POI API 的核心模型。官方 Spreadsheet API 同样以 Workbook、Sheet、Row、Cell 这类对象来操作表格内容。(Apache POI )


八、创建第一个 Excel

首先添加 Maven 依赖。

如果主要使用:

.xlsx

一般需要:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.5.1</version>
</dependency>

然后创建一个 Excel:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;

public class ExcelDemo {

    public static void main(String[] args) throws Exception {

        Workbook workbook = new XSSFWorkbook();

        Sheet sheet = workbook.createSheet("用户");

        Row header = sheet.createRow(0);

        header.createCell(0).setCellValue("ID");
        header.createCell(1).setCellValue("姓名");
        header.createCell(2).setCellValue("年龄");

        Row row = sheet.createRow(1);

        row.createCell(0).setCellValue(1);
        row.createCell(1).setCellValue("张三");
        row.createCell(2).setCellValue(25);

        try (FileOutputStream outputStream =
                     new FileOutputStream("users.xlsx")) {

            workbook.write(outputStream);
        }

        workbook.close();
    }
}

生成:

users.xlsx

内容:

ID 姓名 年龄
1 张三 25

九、这段代码到底发生了什么?

第一步:

Workbook workbook = new XSSFWorkbook();

创建:

Excel 文件

第二步:

Sheet sheet = workbook.createSheet("用户");

创建:

用户 Sheet

第三步:

Row header = sheet.createRow(0);

创建:

第 1 行

注意 POI 行号:

从 0 开始

第四步:

header.createCell(0);

创建:

第 1 个单元格

同样:

Cell Index 从 0 开始

最后:

workbook.write(outputStream);

把内存中的 Workbook:

序列化

成:

真实 .xlsx 文件

十、POI 可以控制 Excel 格式吗?

当然可以。

例如:

字体
字号
粗体
颜色
背景
边框
对齐
数字格式
日期格式
列宽
行高
合并单元格
公式

等等。

官方 Quick Guide 中提供了字体、边框、填充颜色、对齐、单元格格式、合并单元格等大量操作。(Apache POI )


十一、设置标题格式

例如:

CellStyle style = workbook.createCellStyle();

Font font = workbook.createFont();

font.setBold(true);
font.setFontHeightInPoints((short) 14);

style.setFont(font);

style.setAlignment(
        HorizontalAlignment.CENTER
);

Cell cell = header.createCell(0);

cell.setCellValue("用户编号");
cell.setCellStyle(style);

这里关系:

Font
 ↓
字体样式

CellStyle
 ↓
单元格样式

Cell
 ↓
应用 Style

十二、设置边框

例如:

style.setBorderTop(BorderStyle.THIN);
style.setBorderBottom(BorderStyle.THIN);
style.setBorderLeft(BorderStyle.THIN);
style.setBorderRight(BorderStyle.THIN);

最终可以形成:

┌─────────┐
│ 用户姓名 │
└─────────┘

十三、设置列宽

例如:

sheet.setColumnWidth(0, 20 * 256);

这里:

20

可以粗略理解为:

大约 20 个字符宽度

也可以:

sheet.autoSizeColumn(0);

让 POI 尝试根据内容调整列宽。

不过大数据量场景要谨慎使用大量自动宽度计算,因为它也会增加额外计算开销。


十四、合并单元格

例如要做:

┌─────────────────────┐
│      用户报表        │
└─────────────────────┘

可以:

sheet.addMergedRegion(
    new CellRangeAddress(
        0,
        0,
        0,
        3
    )
);

意思:

第 0 行到第 0 行
第 0 列到第 3 列

全部合并

十五、读取 Excel

POI 不只是生成。

还可以:

读取 Excel

例如用户上传:

users.xlsx

代码:

try (FileInputStream inputStream =
         new FileInputStream("users.xlsx");
     Workbook workbook =
         new XSSFWorkbook(inputStream)) {

    Sheet sheet = workbook.getSheetAt(0);

    for (Row row : sheet) {

        for (Cell cell : row) {

            System.out.println(
                cell.toString()
            );
        }
    }
}

流程:

Excel File
   ↓
InputStream
   ↓
Workbook
   ↓
Sheet
   ↓
Row
   ↓
Cell

这就是:

Excel 导入

的基础。


十六、Excel 导入在真实项目里是什么流程?

例如管理员上传:

用户导入模板.xlsx

里面:

姓名 手机号 年龄
张三 13800000000 25
李四 13900000000 30

后端:

MultipartFile
     ↓
POI
     ↓
读取 Workbook
     ↓
遍历 Row
     ↓
转换 UserDTO
     ↓
参数校验
     ↓
批量 INSERT
     ↓
MySQL

不要简单:

读取一行
↓
INSERT 一次

如果:

10 万行

就可能产生:

10 万次数据库访问

更合理:

读取一定批次
    ↓
例如 500 / 1000 条
    ↓
批量入库

十七、Cell 类型问题

Excel 的一个坑就是:

单元格不全部是 String。

Cell 可能是:

STRING

NUMERIC

BOOLEAN

FORMULA

BLANK

ERROR

所以不能无脑:

cell.getStringCellValue();

否则数字单元格可能报错。

应该根据:

cell.getCellType()

判断。

例如:

switch (cell.getCellType()) {

    case STRING:
        System.out.println(
            cell.getStringCellValue()
        );
        break;

    case NUMERIC:
        System.out.println(
            cell.getNumericCellValue()
        );
        break;

    case BOOLEAN:
        System.out.println(
            cell.getBooleanCellValue()
        );
        break;

    case FORMULA:
        System.out.println(
            cell.getCellFormula()
        );
        break;

    default:
        break;
}

十八、日期为什么很麻烦?

Excel 的日期底层经常实际上是:

数字
+
日期格式

所以读取:

2026-09-08

可能需要先判断:

DateUtil.isCellDateFormatted(cell)

例如:

if (DateUtil.isCellDateFormatted(cell)) {

    Date date = cell.getDateCellValue();
}

否则很容易把:

日期

读取成:

某个数字

十九、POI 如何生成大 Excel?

如果:

10 万
50 万
100 万

行数据。

不要优先:

XSSFWorkbook

应该考虑:

SXSSFWorkbook

例如:

SXSSFWorkbook workbook =
        new SXSSFWorkbook(100);

Sheet sheet =
        workbook.createSheet("订单");

然后不断:

Row row = sheet.createRow(index++);

写数据。

早期行会逐步刷入临时文件。

最后:

workbook.write(outputStream);

之后还应该根据具体使用方式注意关闭资源及清理临时资源。


二十、大 Excel 不能只考虑 POI

很多人会认为:

换 SXSSF
=
一切解决

并不是。

假设:

数据库有 100 万订单

如果你先:

List<Order> list =
    orderMapper.selectAll();

那你已经:

把 100 万对象全部放内存

了。

即使后面使用 SXSSF:

一样可能 OOM

正确思想应该是:

数据库
   ↓
分页 / 游标读取
   ↓
一批 1000 条
   ↓
SXSSF 写 Excel
   ↓
下一批

即:

Database Stream
       ↓
Application Stream
       ↓
Excel Stream

这才是真正的大数据量导出设计。


二十一、POI 如何操作 Word?

除了 Excel,Apache POI 还可以操作 Word。

主要:

.doc
↓
HWPF

.docx
↓
XWPF

官方说明中,HWPF 用于 Word 97 等旧 .doc 格式,而 XWPF 用于 Word 2007+ 的 .docx OOXML 格式。(Apache POI )

现代项目建议重点理解:

XWPF


二十二、Word 的核心对象模型

Excel:

Workbook
 ↓
Sheet
 ↓
Row
 ↓
Cell

Word:

XWPFDocument
     ↓
Word 文档
     │
     ├── XWPFParagraph
     │       ↓
     │      段落
     │       │
     │       └── XWPFRun
     │              ↓
     │             文字片段
     │
     └── XWPFTable
             ↓
            表格

其中最重要的:

Document
Paragraph
Run
Table

二十三、创建一个 Word

例如:

XWPFDocument document =
        new XWPFDocument();

XWPFParagraph paragraph =
        document.createParagraph();

XWPFRun run =
        paragraph.createRun();

run.setText("Apache POI 入门");
run.setBold(true);
run.setFontSize(20);

然后:

try (FileOutputStream out =
         new FileOutputStream("demo.docx")) {

    document.write(out);
}

document.close();

就可以生成:

demo.docx

二十四、XWPFRun 是什么?

这个特别重要。

假设 Word 里面:

Java 开发规范

看起来是一句话。

但内部可能是:

Paragraph
│
├── Run1
│     Java
│     Arial
│     Bold
│
└── Run2
      开发规范
      宋体
      Normal

所以:

Word 的很多文字格式实际上是挂在 Run 上的。

例如:

run.setText("Java");
run.setBold(true);
run.setFontSize(18);
run.setFontFamily("Arial");
run.setColor("FF0000");

可以控制:

文字
字体
字号
粗体
颜色

等信息。


二十五、POI 可以读取 Word 格式吗?

可以读取大量常用格式。

例如:

文字内容
字体
字号
粗体
斜体
颜色
下划线
段落对齐
缩进
段前
段后
行距
表格
图片
页眉
页脚
部分页面设置

例如:

for (XWPFParagraph paragraph :
        document.getParagraphs()) {

    for (XWPFRun run :
            paragraph.getRuns()) {

        System.out.println(
            "文字:" + run.text()
        );

        System.out.println(
            "字体:" + run.getFontFamily()
        );

        System.out.println(
            "字号:" + run.getFontSize()
        );

        System.out.println(
            "粗体:" + run.isBold()
        );

        System.out.println(
            "颜色:" + run.getColor()
        );
    }
}

官方 XWPF 文档说明,XWPF 可以通过 Document、BodyElement、Paragraph、Run 等对象读取和写入 .docx 主要结构,不过某些复杂功能仍需要操作更底层的 OOXML/XMLBeans 对象。(Apache POI )


二十六、POI 特别适合 Word 模板生成

例如公司有模板:

             软件开发合同

甲方:${partyA}

乙方:${partyB}

合同编号:${contractNo}

合同金额:${amount}

签订日期:${date}

Java 从数据库读取:

partyA
=
孔雀科技有限公司

partyB
=
张三

contractNo
=
HT20260001

amount
=
100000

然后替换占位符。

最终:

             软件开发合同

甲方:孔雀科技有限公司

乙方:张三

合同编号:HT20260001

合同金额:100000

这类场景非常常见:

合同生成

证明生成

通知书生成

报告生成

标书生成

证书生成

二十七、但是 Word 比 Excel 难操作

这一点非常现实。

POI 对 Excel 的支持非常成熟。

但 Word 的排版模型复杂得多。

例如:

文本框

复杂浮动图片

SmartArt

复杂域

自动目录

复杂编号

修订

批注

公式

复杂分页

复杂分节

WordArt

这些功能操作起来会困难很多。

Apache POI 官方对 HWPF/XWPF 也明确说明,两者的支持能力并非覆盖 Word 的所有功能,一些场景可能需要操作更底层结构。(Apache POI )

所以:

简单 Word
↓
POI 非常合适

极度复杂 Word 排版
↓
需要评估其他方案

二十八、POI 和 EasyExcel 是什么关系?

国内 Java 项目还有一个非常常见的库:

EasyExcel

很多人会问:

有 EasyExcel 为什么还要学 POI?

因为它们关注层次不完全一样。

可以粗略理解:

业务代码
   ↓
EasyExcel
   ↓
更底层 Excel 文件处理

POI 更接近:

底层 Office 对象模型

你需要自己处理:

Workbook
Sheet
Row
Cell
Style

而 EasyExcel 对:

Excel 导入导出

做了更多业务层封装。

例如你可能只需要:

EasyExcel.write(...)

就能完成很多常见任务。


二十九、什么时候直接用 POI?

适合:

复杂 Excel 格式

复杂样式

公式

图表

合并单元格

特殊 Excel 操作

Word 操作

需要底层控制

三十、什么时候考虑 EasyExcel?

如果需求主要是:

Excel 导入

Excel 导出

大量结构化数据

DTO 映射

监听式读取

可以考虑更高层的 Excel 工具。

尤其业务团队只是想:

List<User>
↓
Excel

没必要每个项目都手写:

Workbook
Sheet
Row
Cell

三十一、POI 在实际项目中最常见的场景

场景一:后台数据导出

例如:

订单管理
↓
导出
↓
orders.xlsx

场景二:批量数据导入

例如:

下载用户模板
↓
填写 Excel
↓
上传
↓
批量创建用户

场景三:财务报表

例如:

收入
成本
利润
订单
退款

生成 Excel。


场景四:合同生成

数据库
↓
合同数据
↓
Word 模板
↓
合同.docx

场景五:Word 格式解析

例如:

用户上传 Word
↓
POI
↓
解析
↓
段落
字体
字号
表格
图片

然后进一步:

保存模板结构

或者:

交给 AI 分析

三十二、POI 常见坑:样式不要疯狂创建

假设:

10 万行

每个 Cell 都:

CellStyle style =
    workbook.createCellStyle();

会产生大量 Style 对象。

应该尽量:

创建公共样式
↓
重复复用

例如:

CellStyle headerStyle =
        createHeaderStyle(workbook);

CellStyle dataStyle =
        createDataStyle(workbook);

然后多个 Cell:

cell.setCellStyle(dataStyle);

三十三、常见坑:一次性查询大量数据库数据

错误:

List<Order> orders =
        orderMapper.selectAll();

然后:

100 万订单
↓
全部进入 JVM

可能直接:

OOM

应该:

分页查询
+
分批写 Excel

三十四、常见坑:循环 INSERT

Excel 导入:

10 万行

错误:

for (User user : users) {
    userMapper.insert(user);
}

意味着:

10 万 SQL

应考虑:

Batch Insert

例如:

每 500 / 1000 条一批

三十五、常见坑:不校验 Excel

用户上传的文件绝对不能:

读出来
↓
直接进数据库

必须校验:

文件类型

文件大小

Sheet 是否存在

表头是否正确

必填字段

手机号

金额

日期

枚举

重复数据

最大行数

例如:

状态:

0
1
2

用户上传:

999

必须拒绝。


三十六、常见坑:导出接口被并发打爆

例如:

/api/order/export

一次需要:

查询 50 万数据
生成 Excel

如果:

100 个人同时点击

可能:

CPU
内存
数据库
磁盘 IO

全部受到压力。

因此大型导出应考虑:

限制并发

异步任务

导出任务中心

对象存储

生成完成后下载

Sentinel 限流

例如:

用户提交导出任务
       ↓
返回 taskId
       ↓
后台异步生成 Excel
       ↓
上传 OSS
       ↓
生成下载地址

比一个 HTTP 请求一直卡几十秒更加可靠。


三十七、POI 和数据库的关系

POI 本身:

不会查询数据库

也不会:

自动操作 MySQL

典型架构:

Controller
    ↓
Service
    ↓
Mapper
    ↓
MySQL
    ↓
List<Order>
    ↓
POI
    ↓
Excel

所以:

MyBatis
→ 数据库
POI
→ Office 文件

完全不同。


三十八、POI 和前端的关系

比如用户点击:

导出订单

前端:

GET /api/order/export

Java:

查询数据
↓
POI
↓
Workbook
↓
HttpServletResponse

然后浏览器:

下载 orders.xlsx

所以 POI 经常位于:

数据库数据
       ↓
     Java
       ↓
      POI
       ↓
    Excel
       ↓
     用户

之间。


三十九、POI 的核心知识图

整个 POI 可以先建立下面这个知识模型:

Apache POI
│
├── Excel
│   │
│   ├── HSSF
│   │     ↓
│   │    .xls
│   │
│   ├── XSSF
│   │     ↓
│   │    .xlsx
│   │
│   └── SXSSF
│         ↓
│      大数据量 .xlsx 写出
│
├── Word
│   │
│   ├── HWPF
│   │     ↓
│   │    .doc
│   │
│   └── XWPF
│         ↓
│        .docx
│
└── PowerPoint
    │
    ├── HSLF
    │     ↓
    │    .ppt
    │
    └── XSLF
          ↓
         .pptx

对于 Java 后端:

重点掌握:

XSSF
SXSSF
XWPF

基本就已经覆盖很多常见业务了。


四十、Excel 再压缩成一张图

Workbook
   │
   ├── Sheet
   │     │
   │     ├── Row
   │     │    │
   │     │    ├── Cell
   │     │    ├── Cell
   │     │    └── Cell
   │     │
   │     └── Row
   │
   └── Sheet

看到:

Workbook

想到:

Excel 文件

看到:

Sheet

想到:

工作表

看到:

Row

想到:

看到:

Cell

想到:

单元格

四十一、Word 再压缩成一张图

XWPFDocument
     │
     ├── XWPFParagraph
     │       │
     │       ├── XWPFRun
     │       └── XWPFRun
     │
     ├── XWPFTable
     │       │
     │       └── Cell
     │            ↓
     │         Paragraph
     │            ↓
     │           Run
     │
     ├── Header
     │
     └── Footer

看到:

Document

想到:

Word

看到:

Paragraph

想到:

段落

看到:

Run

想到:

拥有一套文字格式的文字片段

这个概念非常重要。


四十二、面试怎么回答 Apache POI?

如果面试官问:

Apache POI 是什么?

可以回答:

Apache POI 是 Apache 开源的 Java Office 文档处理库,可以使用 Java 对 Excel、Word、PowerPoint 等 Microsoft Office 文件进行读取、创建和修改。在 Excel 场景中,HSSF 主要处理 .xls,XSSF 主要处理 .xlsx,SXSSF 适合大数据量 .xlsx 流式写出;在 Word 场景中,HWPF 主要处理 .doc,XWPF 主要处理 .docx。实际 Java 后端项目中通常用于 Excel 导入导出、报表生成、合同生成以及 Word 文档解析等业务。

如果用一句大白话:

Apache POI 就是 Java 操作 Excel、Word 等 Office 文件的一套工具。


四十三、什么时候应该使用 POI?

如果你的需求是:

生成 Excel
读取 Excel
修改 Excel
生成 Word
读取 Word
提取 Word 格式
复杂表格
复杂 Office 操作

POI 非常适合。

如果只是:

非常简单的数据 Excel 导入导出

可以考虑:

EasyExcel

等更高层封装。

如果需要:

完全像 Word 软件一样
100% 无损处理所有复杂 Word 元素

那么仅靠 POI 未必足够,需要根据具体文档复杂度进一步评估。


四十四、最终总结

Apache POI 最核心的作用就是:

Java
 ↓
Office

其中最重要:

Excel
↓
HSSF / XSSF / SXSSF

和:

Word
↓
HWPF / XWPF

Excel:

.xls
↓
HSSF

.xlsx
↓
XSSF

大数据量 .xlsx
↓
SXSSF

Word:

.doc
↓
HWPF

.docx
↓
XWPF

而 Excel 的核心对象:

Workbook
 ↓
Sheet
 ↓
Row
 ↓
Cell

Word 的核心对象:

Document
 ↓
Paragraph
 ↓
Run

如果把这两个模型理解清楚,Apache POI 基本就算真正入门了。

实际工程中更重要的则是进一步考虑:

文件大小

内存

数据库分页

批量写入

样式复用

异常处理

数据校验

并发导出

安全问题

因为真正优秀的 Excel/Word 功能,并不是:

“能生成文件就完成了。”

而是:

即使面对几十万条数据、复杂模板、多个并发用户和长期维护,系统仍然稳定、可读、可扩展。

Apache POI 入门详解:Java 操作 Excel、Word 从零开始
http://www.clxhxhhr.top/posts/559/
作者
clxstart
发布于
2026-09-09
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。
文章目录
目录