服务器测评网
我们一直在努力

java如何读取docx文件内容并提取数据?

Java读取DOCX文件的方法与实现

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

java如何读取docx文件内容并提取数据?

使用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文档的内部结构,适合需要精细控制文档元素的场景。

java如何读取docx文件内容并提取数据?

添加依赖

<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解析器实现,无需额外依赖。

实现步骤

java如何读取docx文件内容并提取数据?

  1. 将.docx文件视为ZIP压缩包,解压word/document.xml文件。
  2. 使用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;对于纯文本需求,内置类库足够,注意异常处理和资源释放,确保程序的健壮性。

赞(0)
未经允许不得转载:好主机测评网 » java如何读取docx文件内容并提取数据?