![](/img/trans.png)
[英]Java POI the supplied data appears to be in the Office 2007+ XML
[英]Reading property sets from Office 2007+ documents with java poi
我试图从Office 2007+文档(docx,xlsx)中读取属性集。 在http://poi.apache.org/hpsf/how-to.html上找到了惊人的解决方案。 有一个Office 2003和早期格式的示例(doc,xls,不带“ x”)。
public class ReadSummaryInformation {
public static void main(final String[] args) throws IOException {
final String filename = "C://file.docx";
POIFSReader r = new POIFSReader();
r.registerListener(new MyPOIFSReaderListener(),
"\005SummaryInformation");
r.read(new FileInputStream(filename));
}
static class MyPOIFSReaderListener implements POIFSReaderListener {
public void processPOIFSReaderEvent(final POIFSReaderEvent event)
{
SummaryInformation si = null;
try {
si = (SummaryInformation)
PropertySetFactory.create(event.getStream());
}
catch (Exception ex){
throw new RuntimeException
("Property set stream \"" +
event.getPath() + event.getName() + "\": " + ex);
}
final String title = si.getTitle();
if (title != null)
System.out.println("Title: \"" + title + "\"");
else
System.out.println("Document has no title.");
}
}
}
我试图使用此代码打开docx和xlsx(这意味着我试图从文档中读取“ \\ 005SummaryInformation”),然后猜猜是什么? 我有一个例外:
Exception in thread "main" org.apache.poi.poifs.filesystem.OfficeXmlFileException:
The supplied data appears to be in the Office 2007+ XML. [b]You are calling the part
of POI that deals with OLE2 Office Documents.[/b] You need to call a different part of
POI to process this data (eg XSSF instead of HSSF)
先生http://poi.apache.org/大声地指出:
Office OpenXML Format是在Microsoft Office 2007和2008中发现的基于新标准的XML文件格式。其中包括XLSX,DOCX和PPTX。 该项目提供了一个低级API,以支持使用openxml4j的开放包装约定。
然后我进入poi的api,我发现HPSF具有PropertySet,这是访问我想要的元数据的实际类,但是XSSF没有。 这只是我为该异常找到的解释之一。
我的问题是:我可以从带有POI的Office 2007+文件中读取此奇妙的“ \\ 005SummaryInformation”吗? 我有一丝感觉,源代码的作者悬而未决,但在Office 2007格式问世时就开始使用api结构。
先感谢您!
我尝试这样做,但有一个例外:
try {
OPCPackage pkg = OPCPackage.open(new FileInputStream(new File("D:\\file.docx")));
POIXMLProperties props;
props = new POIXMLProperties(pkg);
System.out.println("The title is " + props.getCoreProperties().getTitle());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Exception in thread "main" java.lang.NoClassDefFoundError: org/dom4j/DocumentException
at org.apache.poi.openxml4j.opc.OPCPackage.init(OPCPackage.java:154)
at org.apache.poi.openxml4j.opc.OPCPackage.<init>(OPCPackage.java:141)
at org.apache.poi.openxml4j.opc.Package.<init>(Package.java:54)
at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:82)
at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:267)
at ReadSummaryInformation.main(ReadSummaryInformation.java:38)
Caused by: java.lang.ClassNotFoundException: org.dom4j.DocumentException
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 6 more
我的类路径如下所示:
.;C:\Program Files (x86)\Java\jre6\lib\ext\QTJava.zip;D:\kituri\Java\JDBC
driver\mysql-connector-java-5.1.22\mysql-connector-java-5.1.22-bin.jar;%JAVA_HOME%
\lib;%XMLBEANS_HOME%\lib\xbean.jar;D:\work\Workspace\document_archive01-2212
\src\RunClass.java;D:\work\Workspace\document_archive01-2212\poi-3.9\ooxml-
lib\dom4j-1.6.1.jar
我的路径如下所示:
C:\oraclexe\app\oracle\product\11.2.0\server\bin;;C:\Oracle11g\product\11.2.0\dbhome_1
\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%
\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\ATI Technologies\ATI.ACE
\Core-Static;C:\Program Files\WIDCOMM\Bluetooth Software\;C:\Program Files\WIDCOMM
\Bluetooth Software\syswow64;C:\Program Files (x86)\QuickTime\QTSystem\;C:\Program
Files (x86)\Java\apache-maven-3.0.4\bin;C:\Program Files (x86)\Java\jdk1.7.0_07\bin;D:
\ChromeDriver;%XMLBEANS_HOME%\bin
我尝试了4天的时间来找到问题(又是重新导入库并设置path变量),但是我头晕目眩,而且我真的没有时间去解决这个似乎还不清楚的问题。 我什至检查了导入的库的完整性(我确信.class文件存在于jar中)。
OOXML文件中的属性相似,但与其OLE2表亲并不完全相同。 因此,您不能直接使用HPSF SummaryInformation代码,但是有类似的东西
您需要的类是POIXMLProperties ,类似于:
OPCPackage pkg = OPCPackage.open(new File("file.xlsx"));
POIXMLProperties props = new POIXMLProperties(pkg);
System.out.println("The title is " + props.getCorePart().getTitle());
从POIXMLProperties中,您可以访问所有内置属性,也可以访问自定义属性!
(请注意,要使用OOXML文件,您需要在类路径上添加一些Jar。ApachePOI 组件页面包含所有详细信息)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.