You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Apache POI 3.17读取doc文件时遇OOXML文件类型错误求助

解决Apache POI读取「伪.doc」文件时的OOXML格式错误

嘿,这个问题我见得太多了——你被文件的后缀名给坑了!那个标着.doc的文件,实际是Office Open XML格式的文档(也就是标准的.docx格式),而你用的HWPFDocument是Apache POI专门用来读取旧版二进制.doc文件的类,用它去读OOXML格式的文件,自然会抛出IllegalArgumentException这个错误。

下面给你一步步的解决方案:

1. 先确认文件的真实格式

  • 最简单的方法:把文件后缀改成.docx,然后用Word打开试试,如果能正常打开,就实锤是格式和后缀不匹配的问题了。
  • 用POI的工具类检测(更严谨):
    import org.apache.poi.poifs.filesystem.FileMagic;
    import java.io.File;
    import java.io.IOException;
    
    public class CheckFileType {
        public static void main(String[] args) throws IOException {
            File file = new File("你的文件路径");
            FileMagic magic = FileMagic.valueOf(file);
            System.out.println("文件真实类型: " + magic);
            // 如果输出是「OOXML」,说明这是docx格式的文件
        }
    }
    

2. 改用正确的POI类读取文件

既然是OOXML格式的文档,就要用XWPFDocument来读取,而不是HWPFDocument。示例代码如下:

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

public class ReadDocxContent {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("你的文件路径");
             XWPFDocument doc = new XWPFDocument(fis)) {
            
            // 遍历文档中的段落并输出内容
            for (XWPFParagraph para : doc.getParagraphs()) {
                System.out.println(para.getText());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3. 兼容两种格式的通用读取方案(可选)

如果你的程序需要同时处理.doc.docx文件,可以先判断文件类型,再选择对应的读取类:

import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.poifs.filesystem.FileMagic;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class ReadAnyWordFile {
    public static void main(String[] args) throws IOException {
        File file = new File("你的文件路径");
        FileMagic magic = FileMagic.valueOf(file);

        try (FileInputStream fis = new FileInputStream(file)) {
            if (magic == FileMagic.OOXML) {
                // 处理docx格式
                try (XWPFDocument doc = new XWPFDocument(fis)) {
                    XWPFWordExtractor extractor = new XWPFWordExtractor(doc);
                    System.out.println("文档内容:\n" + extractor.getText());
                }
            } else if (magic == FileMagic.OLE2) {
                // 处理旧版doc格式
                try (HWPFDocument doc = new HWPFDocument(fis)) {
                    WordExtractor extractor = new WordExtractor(doc);
                    System.out.println("文档内容:\n" + extractor.getText());
                }
            } else {
                System.out.println("不支持的文件类型,请检查文件是否为Word文档");
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者sam alex

火山引擎 最新活动