使用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




