Java开发中读取与解析Word文档的实践教学

 更新时间:2026年06月01日 11:17:27   作者:缺点内向  
日常开发中,难免会遇到需要解析 Word 文档的场景,本文将整理几种在 Java 环境下读取 Word 文档内容的实用方法,涵盖全文提取、段落解析、表格读取和图片导出,希望能给遇到类似需求的开发者一些参考

日常开发中,难免会遇到需要解析 Word 文档的场景。比如搭建文档管理系统时需要提取上传文件的内容,或者做数据迁移时要批量处理存量文档。这类需求如果处理不好,往往会带来不少麻烦。本文将整理几种在 Java 环境下读取 Word 文档内容的实用方法,涵盖全文提取、段落解析、表格读取和图片导出,希望能给遇到类似需求的开发者一些参考。

一、依赖引入

开始写代码之前,先把必要的依赖配置好。以 Maven 项目为例,在 pom.xml 中添加如下内容:

<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.doc</artifactId>
        <version>14.5.3</version>
    </dependency>
</dependencies>

依赖就绪后,就可以正式开始编写读取逻辑了。

二、提取文档的全部文本

如果需求比较简单直接,比如只想把文档里的文字提取出来做全文检索或者关键词分析,那么一次性读取所有文本是最高效的做法。

import com.spire.doc.Document;

public class ReadAllText {
    public static void main(String[] args) {
        Document doc = new Document();
        doc.loadFromFile("sample.docx");

        // 获取文档的完整文本内容
        String allText = doc.getText();
        System.out.println(allText);

        doc.close();
    }
}

getText() 方法会把整篇文档的段落文字拼接成一个字符串,表格中的文字也会一并包含在内。这种方式胜在简洁,几行代码就能搞定。但缺点也很明显——所有内容平铺在一起,标题、正文、表格内容混在一块,丢失了原有的文档结构。

三、按段落逐条读取

当我们需要了解文档的结构层次,或者只关心特定样式的内容时,逐段落地读取就显得很有必要了。比如只提取所有的一级标题,或者跳过页眉页脚只处理正文。

import com.spire.doc.Document;
import com.spire.doc.documents.Paragraph;

public class ReadParagraphs {
    public static void main(String[] args) {
        Document doc = new Document();
        doc.loadFromFile("sample.docx");

        // 遍历文档中的节
        for (int i = 0; i < doc.getSections().getCount(); i++) {
            // 遍历每个节中的段落
            for (int j = 0; j < doc.getSections().get(i).getParagraphs().getCount(); j++) {
                Paragraph paragraph = doc.getSections().get(i).getParagraphs().get(j);

                String text = paragraph.getText();
                String styleName = paragraph.getStyleName();

                System.out.println("样式: " + styleName);
                System.out.println("内容: " + text);
                System.out.println("---");
            }
        }
        doc.close();
    }
}

这里的关键是 getStyleName() 方法,它返回段落在 Word 中应用样式后的名称,比如 "Heading1"、"Heading2"、"Normal" 等等。拿到样式名之后,我们就可以方便地过滤出想要的段落类型。除此之外,Paragraph 对象还能提供对齐方式、缩进值、行距等格式信息,有需要的话可以进一步挖掘。

四、读取表格中的结构化数据

表格在 Word 里往往扮演着承载结构化数据的角色,比如项目排期表、人员信息表、价格清单等等。把这些数据准确读取出来,是很多业务场景下的刚性需求。

import com.spire.doc.Document;
import com.spire.doc.Section;
import com.spire.doc.Table;
import com.spire.doc.TableRow;
import com.spire.doc.TableCell;

public class ReadTable {
    public static void main(String[] args) {
        Document doc = new Document();
        doc.loadFromFile("sample.docx");

        // 遍历所有节
        for (int i = 0; i < doc.getSections().getCount(); i++) {
            Section section = doc.getSections().get(i);

            // 遍历当前节中的表格
            for (int j = 0; j < section.getTables().getCount(); j++) {
                Table table = section.getTables().get(j);
                System.out.println("表格 " + (j + 1) + ":");

                // 按行读取
                for (int k = 0; k < table.getRows().getCount(); k++) {
                    TableRow row = table.getRows().get(k);
                    // 按单元格读取
                    for (int l = 0; l < row.getCells().getCount(); l++) {
                        TableCell cell = row.getCells().get(l);
                        System.out.print(cell.getText() + "\t");
                    }
                    System.out.println();
                }
                System.out.println("============");
            }
        }
        doc.close();
    }
}

代码逻辑比较清晰,按节、表格、行、单元格的层级逐层遍历。读出来的数据可以根据需要组装成二维数组或 List,方便后续写入数据库或导出为 Excel。有一点需要留意:如果文档中的表格存在合并单元格的情况,按行列索引直接读取时可能会遇到空值或者数据位置偏移,实际项目里最好加上对合并单元格的判断处理。

五、导出文档中的图片

文字和表格之外,图片也是 Word 文档中常见的内容类型。有时候我们需要把文档里的图片提取出来单独存储,比如迁移到图床或者存入资源管理系统。

import com.spire.doc.Document;
import com.spire.doc.fields.DocPicture;
import com.spire.doc.interfaces.IDocumentObject;

public class ExtractImages {
    public static void main(String[] args) throws Exception {
        Document doc = new Document();
        doc.loadFromFile("sample.docx");

        int imageIndex = 0;
        // 遍历文档中的子对象
        for (int i = 0; i < doc.getSections().getCount(); i++) {
            for (int j = 0; j < doc.getSections().get(i).getBody().getChildObjects().getCount(); j++) {
                IDocumentObject obj = doc.getSections().get(i).getBody().getChildObjects().get(j);

                // 判断是否为图片对象
                if (obj instanceof DocPicture) {
                    DocPicture picture = (DocPicture) obj;
                    // 保存为 PNG 文件
                    picture.getImage().save("output/image_" + imageIndex + ".png", null);
                    imageIndex++;
                }
            }
        }
        System.out.println("共提取 " + imageIndex + " 张图片");
        doc.close();
    }
}

图片会按编号依次保存到输出目录。如果文档里图片比较多,建议文件命名时加入更具体的标识,避免同名覆盖。另外除了正文中的图片,页眉页脚和文本框里也可能藏着图片对象,按需决定要不要一并处理。

六、几点实用建议

在实际项目中使用时,有几个细节值得留意。第一是格式兼容性,.doc 和 .docx 两种格式都可以用同一套 API 加载,不需要分别写两套逻辑,这在实际开发中能省不少事。第二是资源释放,文档读取完毕后记得调用 close() 方法,否则文件可能会被进程持续占用,导致后续的写入或删除操作失败。第三是对大文件的处理,如果文档体量较大,解析会消耗更多时间和内存,在并发场景下建议提前做好压测,必要时对大文件做异步处理或设置超时机制。

七、最后

本文梳理了 Java 环境下读取 Word 文档内容的几种常见方式,从最直接的全文文本提取,到保留结构的段落遍历与样式识别,再到表格数据解析和图片资源导出,基本覆盖了日常开发中会遇到的典型场景。这些方法可以灵活搭配使用,比如在文档入库时同时提取纯文本做索引、解析表格做结构化存储、导出图片做独立资源管理。掌握了这些基础操作之后,再面对更复杂的文档处理需求,心里也会有底,实现起来会更加从容。

以上就是Java开发中读取与解析Word文档的实践教学的详细内容,更多关于Java读取与解析Word的资料请关注脚本之家其它相关文章!

相关文章

  • Java设计模式UML之类图精解

    Java设计模式UML之类图精解

    在UML类图中,类使用包含类名、属性(field) 和方法(method) 且带有分割线的矩形来表示,比如下图表示一个Employee类,它包含name,age和email这3个属性,以及modifyInfo()方法
    2022-02-02
  • Java多线程实现聊天客户端和服务器

    Java多线程实现聊天客户端和服务器

    这篇文章主要为大家详细介绍了Java多线程聊天客户端和服务器实现代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • 深入解析SpringBatch适配器

    深入解析SpringBatch适配器

    Spring Batch是Spring的一个子项目,使用Java语言并基于Spring框架为基础开发,使得已经使用 Spring 框架的开发者或者企业更容易访问和利用企业服务,本文给大家介绍SpringBatch适配器的相关知识,感兴趣的朋友一起看看吧
    2021-11-11
  • java中break和continue源码解析

    java中break和continue源码解析

    这篇文章主要针对java中break和continue的区别进行详细介绍,帮助大家更好的学习了解java中break和continue源码,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • mybatisplus之使用@Select解读

    mybatisplus之使用@Select解读

    这篇文章主要介绍了mybatisplus之使用@Select解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Java 解析Markdown文档格式的两种方式

    Java 解析Markdown文档格式的两种方式

    CommonMark和Flexmark是两种用于解析Markdown文档的Java库,CommonMark提供了一种简洁和一致的Markdown格式语法规范,但不支持目录解析,而Flexmark是一个基于CommonMark的扩展库,不仅遵循了CommonMark规范,还提供了更多灵活的API和扩展功能
    2024-10-10
  • 从面试中的问题分析ThreadLocal

    从面试中的问题分析ThreadLocal

    这篇文章主要介绍了从面试中的问题分析ThreadLocal,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,下面我们来一起学习一下吧
    2019-06-06
  • 基于request获取访问者真实IP代码示例

    基于request获取访问者真实IP代码示例

    这篇文章主要介绍了基于request获取访问者真实IP代码示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • MyBatis-Flex+ShardingSphere-JDBC多数据源分库分表实现

    MyBatis-Flex+ShardingSphere-JDBC多数据源分库分表实现

    本文介绍了使用MyBatis-Flex和ShardingSphere-JDBC实现多数据源分库分表的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-10-10
  • JAVA并发图解

    JAVA并发图解

    这篇文章主要介绍了JAVA的并发,文中图解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2021-09-09

最新评论