簡體   English   中英

使用Java POI從Office 2007+文檔讀取屬性集

[英]Reading property sets from Office 2007+ documents with java poi

我試圖從Office 2007+文檔(docx,xl​​sx)中讀取屬性集。 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
  • POI-3.9-20121203.jar
  • xbean.jar
  • poi-ooxml-3.9-20121203.jar導入到項目中並設置為buildpath。

我嘗試了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM