Java 读取文档并使用Apache POI重写,但无法使用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无法打开)? 这是我的密码: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无法
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目前还不支持这种格式。标头的读取方式是小端而不是大端,因此您需要反转字符-它实际上是