使用Java poi从Office 2007+文档读取属性集

我试图从Office 2007+文档(docx,xl​​sx)读取属性集。 在http://poi.apache.org/hpsf/how-to.html上find了惊人的解决scheme。 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格式是Microsoft Office 2007和2008中新的基于标准的XML文件格式,包括XLSX,DOCX和PPTX。 该项目提供了一个低级的API来支持使用openxml4j的开放包装约定。

然后我得到poi的api,我发现HPSF有PropertySet,它是访问我想要的元数据的实际类,但是XSSF没有。 这只是我发现的例外之一。

我的问题是:我可以从Office 2007+带有POI的文件中读取这个奇妙的“\ 005SummaryInformation”吗? 我有一个string感觉,源代码的作者在空气中留下了api结构,并在Office 2007格式出来时开始了一个新的结构。

先谢谢你!


我试图做到这一点,但我有一个例外:

 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 

我的类path如下所示:

  .;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 

我的path如下所示:

  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 
  • POI-3.9-20121203.jar
  • xbean.jar
  • poi-ooxml-3.9-20121203.jar在项目中导入并设置为buildpath。

我试图find4天的问题(又名重新导入图书馆和设置pathvariables),但我晕了,我真的没有时间处理这个问题,似乎并不清楚。 我甚至检查了导入库的完整性(我确信.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文件,您需要在类path上添加一些Jars, Apache POI组件页面包含所有的细节)