Apache POI解析Word文档完全指南

Apache POI解析Word文档完全指南

在Java开发中,处理Word文档是一项常见需求。Apache POI作为最流行的Office文档处理库,提供了对Word、Excel、PowerPoint等格式的全面支持。本文将重点介绍如何使用POI解析Word文档(包括.doc和.docx格式),帮助开发者高效提取文档内容。

1. 环境准备

首先,在项目中引入POI依赖。以Maven为例:

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

poi处理旧版.doc格式,poi-ooxml处理新版.docx格式,poi-scratchpad提供HWPF(Word旧格式)支持。

2. 解析.docx格式(XWPF)

.docx格式基于XML,使用XWPF组件解析。示例:

import org.apache.poi.xwpf.usermodel.*;
import java.io.FileInputStream;
import java.io.IOException;

public class ReadDocx {
public static void main(String[] args) throws IOException {
try (FileInputStream fis = new FileInputStream("sample.docx");
XWPFDocument document = new XWPFDocument(fis)) {
// 读取段落
for (XWPFParagraph paragraph : document.getParagraphs()) {
System.out.println(paragraph.getText());
}
// 读取表格
for (XWPFTable table : document.getTables()) {
for (XWPFTableRow row : table.getRows()) {
for (XWPFTableCell cell : row.getTableCells()) {
System.out.print(cell.getText() + " ");
}
System.out.println();
}
}
// 读取图片
for (XWPFPictureData picture : document.getAllPictures()) {
byte[] data = picture.getData();
String fileName = picture.getFileName();
// 处理图片数据
}
}
}
}

3. 解析.doc格式(HWPF)

旧版.doc格式使用HWPF(Horrible Word Processor Format)组件:

import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.extractor.WordExtractor;
import java.io.FileInputStream;
import java.io.IOException;

public class ReadDoc {
public static void main(String[] args) throws IOException {
try (FileInputStream fis = new FileInputStream("sample.doc");
HWPFDocument document = new HWPFDocument(fis)) {
WordExtractor extractor = new WordExtractor(document);
String[] paragraphs = extractor.getParagraphText();
for (String p : paragraphs) {
System.out.println(p);
}
// 读取表格较为复杂,需要遍历Range
}
}
}

4. 常见问题与技巧

  • 处理大型文档:建议使用流式API(SAX)避免内存溢出,POI的XWPFDocument默认加载整个文档,对于超大文档可考虑XWPFReader。
  • 保留格式:如果只需纯文本,使用WordExtractor;如需保留样式,需遍历Run对象。
  • 编码问题:确保文件流编码正确,中文乱码可尝试设置System.setProperty("file.encoding","UTF-8")。
  • 版本兼容:POI 5.x支持Office 2007及以上,旧版.doc需依赖poi-scratchpad。

5. 总结

Apache POI为Java开发者提供了强大而灵活的Word文档解析能力。通过XWPF和HWPF组件,可以轻松读取文本、表格、图片等元素。在实际项目中,建议根据文档格式选择对应组件,并注意资源管理和性能优化。掌握POI,让Word文档处理不再困难。