2013-09-05 37 views
2

我試圖從Office 2007+文檔(docx,xl​​sx)讀取屬性集。在http://poi.apache.org/hpsf/how-to.html上找到了驚人的解決方案。有一個Office 2003和早期格式的示例(doc,xls,不帶「x」)。從Office 2007+文檔中讀取屬性集與Java poi

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/狀態響亮和明確表示:

辦公室OpenXML格式是新的基於標準的XML文件格式在Microsoft Office 2007和2008年這包括XLSX發現 , DOCX和PPTX。 該項目提供了一個低級API來支持使用openxml4j的開放包裝 約定。

然後我到了poi的api,我發現HPSF有PropertySet,它是訪問我想要的元數據的實際類,但是XSSF沒有。這只是我爲例外找到的解釋之一。

我的問題是:我可以從Office 2007+帶有POI的文件中讀取這個奇妙的「\ 005SummaryInformation」嗎? 我有一個字符串,感覺源代碼的作者在空中離開了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 

我的類路徑是這樣的:

.;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 
  • POI-3.9-20121203.jar
  • xbean.jar
  • POI-OOXML-3.9-20121203.jar 進口項目,並設置爲構建路徑。

我試圖找到4天的問題(又名重新導入庫和設置路徑變量),但我頭暈目眩,我真的沒有時間來處理這個似乎不是這個問題一點都不清楚。我檢查了甚至導入庫的完整性(我確信.class文件存在於jar中)。

回答

3

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文件的工作,你需要在你的類路徑一些額外的罐子。在Apache POI Components page有所有細節)

+0

它的工作最後。構建路徑中缺少一些庫。謝謝你的回答,並很抱歉這麼晚回覆。 –

+0

很高興聽到它的工作!請點擊答案旁邊的小「勾號」以接受它,這樣大家都知道這是正確的! – Gagravarr