java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java读取与解析Word

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

作者:缺点内向

日常开发中,难免会遇到需要解析 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的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文