Java 读取文档并使用Apache POI重写,但无法使用office打开

Java 读取文档并使用Apache POI重写,但无法使用office打开,java,apache-poi,Java,Apache Poi,我正在尝试用Java中的ApachePOI修改一个文档 首先,无法读取test.doc,并引发异常: “org.apache.poi.poifs.filesystem.NotOLE2FileException:头签名无效;读取0x6576206C6D783F3C,应为0xE11AB1A1E011CFD0-您的文件似乎不是有效的OLE2文档 " 所以我把文档保存为“word 97-03”格式,这样POI就可以正确地读取文档了 但是,当我尝试将内容重写为新文件而不做任何更改时,MS Office无法

我正在尝试用Java中的ApachePOI修改一个文档

首先,无法读取test.doc,并引发异常:

“org.apache.poi.poifs.filesystem.NotOLE2FileException:头签名无效;读取0x6576206C6D783F3C,应为0xE11AB1A1E011CFD0-您的文件似乎不是有效的OLE2文档 "

所以我把文档保存为“word 97-03”格式,这样POI就可以正确地读取文档了

但是,当我尝试将内容重写为新文件而不做任何更改时,MS Office无法打开文件output.doc。

当我用MS Office自己制作一个新的文档时,POI工作正常,一切正常

所以问题是“test.doc”

test.doc是由某种程序生成的,我无法访问该程序的代码,因此我不知道出了什么问题

我的问题是:

1.As test.doc可由MS Office读取为什么POI不能保存为新格式的文档? 2.由于POI可以读取文档,为什么它不能写回新文件(MS Office无法打开)?

这是我的密码:

    FileInputStream fis = null;
    try {
        fis = new FileInputStream("test.doc");
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    POIFSFileSystem pfs = null;
    try {
        pfs = new POIFSFileSystem(fis);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    HWPFDocument hwdf = null;
    try {
        hwdf = new HWPFDocument(pfs);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    FileOutputStream fos = null;
    try {
        fos = new FileOutputStream(new File("output.doc"));
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    try {
        hwdf.write(fos);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }finally {

    }

    try {
        fos.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    try {
        fis.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    try {
        pfs.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

十六进制文件以ASCII和read little endian格式读取,并转换为
,感谢您的提示。使用一些工具比较文档后,我发现test.doc实际上不是纯word 03格式,而是“word 2003 XML”。坏消息是,Microsoft Office suite的基于XML的文件格式有一种不同的格式,Apache POI目前还不支持这种格式。标头的读取方式是小端而不是大端,因此您需要反转字符-它实际上是