以下是 HWPFDocument(处理 .doc 文件)和 XWPFDocument(处理 .docx 文件)的详细对比,涵盖文件格式、功能特性、使用场景及开发注意事项:

1. 核心对比表

特性HWPFDocument (.doc)XWPFDocument (.docx)文件格式旧版二进制格式(Word 97-2003)基于 XML 的 Open Office 格式(Word 2007+)Apache POI 支持poi-scratchpad 模块poi-ooxml 模块维护状态已停止活跃维护持续更新和维护功能复杂度支持基础文本、简单表格、字体样式支持复杂表格、图表、页眉/页脚、超链接、SmartArt 等中文兼容性需手动处理编码(如 GB2312),易乱码直接支持 Unicode,推荐设置中文字体(如“宋体”)性能处理简单文档更快(二进制格式)处理复杂文档较慢(XML 解析开销)代码复杂度简单但功能有限复杂但功能强大适用场景遗留系统维护、仅需读取/修改旧版 .doc 文件现代应用开发、需要生成或操作复杂 .docx 文档HWPFDocument 需要引入的jar包,版本尽量在4.1.2之下:

org.apache.poi

poi

4.0.1

org.apache.poi

poi-scratchpad

4.0.1

XWPFDocument 需要引入的jar包,版本尽量在4.1.2之上:

org.apache.poi

poi

5.2.0

org.apache.poi

poi-ooxml

5.2.0

2. 功能特性对比

2.1 文本与段落

HWPFDocument

通过 Range 和 CharacterRun 操作文本片段。支持基础字体样式(加粗、斜体、字号、颜色)。段落对齐和缩进功能有限。

XWPFDocument

通过 XWPFParagraph 和 XWPFRun 控制段落和文本。支持高级样式(阴影、下划线类型、字符间距)。支持多级列表和自定义编号。

2.2 表格操作

HWPFDocument

使用 Table 和 Cell 操作表格,功能简单。不支持合并单元格,需手动操作底层 API。表格样式(边框、颜色)设置复杂且不稳定。

XWPFDocument

通过 XWPFTable 和 XWPFTableCell 实现复杂表格。支持横向和纵向合并单元格(工具方法可直接调用)。支持自定义表格边框、背景色、列宽(EMU 单位)。

2.3 图片与多媒体

HWPFDocument

插入图片需使用 OfficeDrawing API,操作复杂且易出错。不支持直接插入 SVG 或现代图片格式。

XWPFDocument

通过 XWPFRun.addPicture() 直接插入图片(PNG、JPEG 等)。支持调整图片尺寸、旋转、裁剪。

2.4 高级功能

HWPFDocument

不支持页眉/页脚、超链接、分页符等高级功能。无法操作文档元数据(如属性、批注)。

XWPFDocument

支持页眉、页脚、页码、超链接、分节符。可操作文档属性、批注、目录(TOC)。支持与模板引擎(如 Freemarker)集成。

3. 代码示例对比

3.1 插入表格(HWPFDocument)

// 创建表格(功能有限,代码复杂)

HWPFDocument doc = new HWPFDocument();

Range range = doc.getRange();

Table table = range.insertTable(3, 3); // 3行3列

// 填充表头

TableRow headerRow = table.getRow(0);

headerRow.getCell(0).setText("姓名");

headerRow.getCell(1).setText("年龄");

headerRow.getCell(2).setText("部门");

// 合并单元格需手动操作底层 API(无直接支持)

3.2 插入表格(XWPFDocument)

// 创建表格(支持合并单元格)

XWPFDocument doc = new XWPFDocument();

XWPFTable table = doc.createTable(3, 3);

// 合并单元格(工具方法)

mergeCellsHorizontal(table, 1, 0, 1);

table.getRow(1).getCell(0).setText("合并示例");

// 设置列宽和边框

CTTblGrid grid = table.getCTTbl().addNewTblGrid();

grid.addNewGridCol().setW(Units.toEMU(3000));

4. 使用建议

选择 HWPFDocument 的场景

必须处理旧的 .doc 格式文件。仅需读取或修改简单文本内容。对性能要求较高且文档结构简单。

选择 XWPFDocument 的场景

需要生成或操作现代 .docx 格式文档。要求复杂功能(表格合并、页眉/页脚、图片插入)。需要长期维护和版本兼容性。

5. 迁移与兼容性

从 .doc 迁移到 .docx

使用 Microsoft Word 或开源工具(如 LibreOffice)将旧文件另存为 .docx 格式。混合处理

若需同时支持两种格式,可分别使用 HWPFDocument 和 XWPFDocument,但会增加代码维护成本。

6. 总结

HWPFDocument 适用于遗留系统维护,功能简单但局限性明显。XWPFDocument 是现代 Java 文档处理的首选,功能全面且持续更新。优先选择 .docx 格式,除非明确需要兼容旧版 .doc 文件。