Java如何解析Word文档?

Java解析Word文档常用Apache POI库,支持读取.doc和.docx格式,提取文本、表格、图片等内容,也可用Tika或docx4j进行文本抽取或高级操作,实现结构化数据处理。

在Java中解析Word文档,开发者常用Apache POIApache Tika等成熟库实现,以下为详细方法及代码示例:

Java如何解析Word文档?


主流方法及代码实现

Apache POI(推荐)

  • 适用格式.doc (HWPF) 和 .docx (XWPF)

  • Maven依赖

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>5.2.3</version> <!-- .doc支持 -->
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>5.2.3</version> <!-- .docx支持 -->
    </dependency>
  • 解析.docx文件

    import org.apache.poi.xwpf.usermodel.*;
    import java.io.FileInputStream;
    public class DocxParser {
        public static void main(String[] args) throws Exception {
            try (FileInputStream fis = new FileInputStream("document.docx");
                 XWPFDocument doc = new XWPFDocument(fis)) {
                // 1. 提取文本
                StringBuilder text = new StringBuilder();
                for (XWPFParagraph p : doc.getParagraphs()) {
                    text.append(p.getText()).append("n");
                }
                System.out.println("文本内容: " + text);
                // 2. 提取表格
                for (XWPFTable table : doc.getTables()) {
                    for (XWPFTableRow row : table.getRows()) {
                        for (XWPFTableCell cell : row.getTableCells()) {
                            System.out.print(cell.getText() + "t");
                        }
                        System.out.println();
                    }
                }
                // 3. 提取图片(需保存到本地)
                for (XWPFPictureData pic : doc.getAllPictures()) {
                    byte[] data = pic.getData();
                    String fileName = pic.getFileName();
                    // 保存图片到文件系统...
                }
            }
        }
    }
  • 解析.doc文件(旧格式)

    Java如何解析Word文档?

    import org.apache.poi.hwpf.HWPFDocument;
    import org.apache.poi.hwpf.extractor.WordExtractor;
    public class DocParser {
        public static void main(String[] args) throws Exception {
            try (FileInputStream fis = new FileInputStream("document.doc");
                 HWPFDocument doc = new HWPFDocument(fis)) {
                WordExtractor extractor = new WordExtractor(doc);
                String text = extractor.getText(); // 获取全文
                System.out.println(text);
            }
        }
    }

Apache Tika(自动识别格式)

  • 优势:自动检测文件类型,支持Word/PDF/Excel等

  • Maven依赖

    <dependency>
        <groupId>org.apache.tika</groupId>
        <artifactId>tika-core</artifactId>
        <version>2.7.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.tika</groupId>
        <artifactId>tika-parsers</artifactId>
        <version>2.7.0</version>
    </dependency>
  • 代码示例

    import org.apache.tika.Tika;
    import org.apache.tika.metadata.Metadata;
    import java.io.FileInputStream;
    public class TikaParser {
        public static void main(String[] args) throws Exception {
            Tika tika = new Tika();
            try (FileInputStream fis = new FileInputStream("document.docx")) {
                Metadata metadata = new Metadata();
                String content = tika.parseToString(fis, metadata);
                System.out.println("内容: " + content);
                System.out.println("类型: " + metadata.get(Metadata.CONTENT_TYPE));
            }
        }
    }

关键注意事项

  1. 格式兼容性

    Java如何解析Word文档?

    • .docx(POI的XWPFDocument)解析更稳定,.docHWPFDocument)已停止更新。
    • 复杂格式(如公式、艺术字)可能解析失败,需测试验证。
  2. 性能优化

    • 大文件处理:使用POI SAX模式(如XSSFEventBasedExcelExtractor)避免内存溢出。
    • 关闭资源:用try-with-resources确保流和文档对象关闭。
      提取限制**:
    • POI可获取文本、表格、图片,但无法保留原始样式(如字体颜色)。
    • 需处理加密文档:通过POIEncryptedDocumentException捕获异常。

常见问题解决方案

  • 乱码问题:指定编码(如TextExtractor.setEncoding("UTF-8"))。
  • 依赖冲突:检查Maven的依赖树(mvn dependency:tree),排除重复库。
  • 云文档解析:先通过API(如Microsoft Graph)下载为本地文件再解析。

替代方案

  • docx4j:专精.docx,支持图表/批注等高级特性(但学习曲线陡峭)。
  • OpenPDF:专注PDF,若需Word转PDF后解析可使用。
  • 商业库Aspose.Words(付费,功能全面,支持渲染为HTML/PDF)。

引用说明

通过上述方法,开发者可高效解析Word内容至Java应用,推荐优先使用Apache POI处理结构化数据,或Apache Tika实现快速全文提取,实际部署前建议进行多格式兼容性测试。

原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/40168.html

(0)
酷盾叔的头像酷盾叔
上一篇 2025年6月27日 16:26
下一篇 2025年6月17日 02:49

相关推荐

  • Java如何控制鼠标?

    在Java中设置鼠标主要通过Cursor类实现,可自定义光标图标或使用系统预设样式,结合Component.setCursor()方法为组件指定光标,例如设置等待光标Cursor.WAIT_CURSOR,也可通过Toolkit.createCustomCursor()创建自定义图像光标。

    2025年6月23日
    000
  • Java如何创建多个线程池?

    在Java中可通过Executors工具类创建多个线程池,使用newFixedThreadPool、newCachedThreadPool等方法分别生成不同配置的ThreadPoolExecutor实例,需为每个线程池指定独立的线程数量、队列等参数,确保任务隔离和资源合理分配。

    2025年5月29日
    100
  • 如何在Java中输入英文?

    在Java中输入英文无需特殊输入法处理,直接使用标准输入类(如Scanner)读取即可,程序获取的是键盘输入的字符数据,与系统输入法无关,英文作为基础字符集,Java默认支持处理。 ,“java,Scanner scanner = new Scanner(System.in);,String englishText = scanner.nextLine(); // 直接输入英文,“

    2025年6月10日
    000
  • Java中如何快速检查变量或对象类型?

    在Java中,可通过对象.getClass().getName()获取对象类型全限定名,或使用instanceof运算符判断类型,基本类型需通过包装类的TYPE字段或反射获取,Integer.TYPE返回int,变量.getClass()仅适用于对象类型。

    2025年5月29日
    600
  • Java纸牌怎么导入图片?

    在Java纸牌游戏中导入图片,通常使用ImageIO.read()方法加载本地或资源文件夹中的图片文件,将图片放入项目目录(如src/resources),通过类加载器获取路径或直接指定文件路径读取,确保格式支持(如PNG、JPG)。

    2025年6月22日
    100

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN