Java读取DOCX文件的方法与实现
在Java开发中,处理Word文档(如.docx格式)是一项常见需求,特别是在数据导入、报告生成或文档解析等场景,由于.docx是基于XML的开放格式,Java提供了多种方式来读取其内容,本文将详细介绍几种主流的实现方法,包括使用Apache POI、docx4j以及Java内置类库的解决方案,并附上关键代码示例和注意事项。

使用Apache POI读取DOCX文件
Apache POI是Java操作Office文档最常用的工具库,支持对Word、Excel、PPT等格式的读写,对于.docx文件,POI提供了XWPF(XML Word Processing Format)API,能够高效解析文档内容。
添加依赖
需在项目中引入Apache POI的Maven依赖:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
核心代码实现
通过XWPFDocument类加载.docx文件后,可遍历文档中的段落、表格、图片等元素:
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import java.io.FileInputStream;
import java.io.IOException;
public class DocxReader {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("example.docx");
XWPFDocument document = new XWPFDocument(fis)) {
// 读取段落文本
for (XWPFParagraph paragraph : document.getParagraphs()) {
System.out.println(paragraph.getText());
}
// 读取表格内容
for (XWPFTable table : document.getTables()) {
table.getRows().forEach(row -> {
row.getTableCells().forEach(cell -> {
System.out.print(cell.getText() + "\t");
});
System.out.println();
});
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
高级功能
- 样式提取:通过
paragraph.getCTP().getPPr()获取段落样式(如字体、颜色)。 - 图片处理:使用
XWPFPictureData类提取文档中的图片并保存为文件。 - 页眉页脚:通过
document.getHeaderList()和document.getFooterList()读取页眉页脚内容。
注意事项:
- POI对大文件的处理可能占用较高内存,建议结合
SXSSF(流式API)优化。 - 需注意处理复杂格式(如合并单元格、嵌套表格)时的逻辑。
使用docx4j库读取DOCX文件
docx4j是另一个专门处理.docx文件的Java库,其API设计更贴近Word文档的内部结构,适合需要精细控制文档元素的场景。

添加依赖
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j</artifactId>
<version>11.4.4</version>
</dependency>
核心代码实现
通过WordprocessingMLPackage类加载文档,并使用JAXB解析XML结构:
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
import org.docx4j.wml.Text;
import java.util.List;
public class Docx4jReader {
public static void main(String[] args) {
try {
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new java.io.File("example.docx"));
MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart();
String plainText = documentPart.getText();
System.out.println(plainText);
// 提取特定文本(如从段落中)
ObjectFactory factory = new ObjectFactory();
List<Object> paragraphs = documentPart.getContent();
paragraphs.forEach(para -> {
if (para instanceof org.docx4j.wml.P) {
org.docx4j.wml.P p = (org.docx4j.wml.P) para;
p.getContent().forEach(r -> {
if (r instanceof org.docx4j.wml.R) {
org.docx4j.wml.R run = (org.docx4j.wml.R) r;
run.getContent().forEach(t -> {
if (t instanceof Text) {
System.out.print(((Text) t).getValue());
}
});
}
});
System.out.println();
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
优势与适用场景
- 支持直接操作Word的底层XML结构,适合修改文档样式或添加自定义元素。
- 对复杂文档(如包含SmartArt、图表)的兼容性较好。
注意事项:
- docx4j的学习曲线较陡,需熟悉JAXB和Word的ML结构。
- 处理大型文档时,性能可能不如POI。
使用Java内置类库(仅限简单文本提取)
若仅需提取.docx中的纯文本(不保留格式),可通过Java内置的ZIP和XML解析器实现,无需额外依赖。
实现步骤:

- 将.docx文件视为ZIP压缩包,解压
word/document.xml文件。 - 使用DOM或SAX解析器提取
<w:t>标签内的文本内容。
示例代码:
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
public class SimpleDocxReader {
public static void main(String[] args) {
try (ZipFile zipFile = new ZipFile("example.docx")) {
ZipEntry entry = zipFile.getEntry("word/document.xml");
try (InputStream is = zipFile.getInputStream(entry)) {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(is);
NodeList texts = document.getElementsByTagName("w:t");
for (int i = 0; i < texts.getLength(); i++) {
System.out.print(texts.item(i).getTextContent() + " ");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
局限性:
- 无法处理图片、表格等非文本内容。
- 需手动处理XML命名空间和复杂结构,代码量较大。
总结与选择建议
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Apache POI | 功能全面,文档丰富,社区支持好 | 大文件内存占用高 | 通用文档读写,复杂格式处理 |
| docx4j | 细粒度控制,兼容复杂文档 | 学习成本高,性能一般 | 需要深度操作文档结构或样式 |
| 内置类库 | 无需依赖,轻量级 | 功能有限,代码复杂 | 仅需简单文本提取 |
根据实际需求选择合适的方法:若需快速实现基本功能,推荐Apache POI;若需高度定制化,可考虑docx4j;对于纯文本需求,内置类库足够,注意异常处理和资源释放,确保程序的健壮性。




















