【问题标题】:Reading property sets from Office 2007+ documents with java poi使用 java poi 从 Office 2007+ 文档中读取属性集
【发布时间】:2013-09-05 11:27:47
【问题描述】:

我尝试从 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 格式是发现的基于新标准的 XML 文件格式 在 Microsoft Office 2007 和 2008 中。这包括 XLSX、DOCX 和 PPTX。 该项目提供了一个底层 API 来支持 Open Packaging 使用 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 在项目中导入并设置为构建路径。

我试图找到问题 4 天(也就是重新导入库并设置路径变量)但我头晕目眩,我真的没有时间处理这个似乎根本不清楚的问题.我什至检查了导入的库的完整性(我确保 .class 文件存在于 jar 中)。

【问题讨论】:

    标签: java excel apache-poi


    【解决方案1】:

    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 文件,您需要在类路径中添加一些额外的 Jars。Apache POI Components page 包含所有详细信息)

    【讨论】:

    • 终于成功了。构建路径中缺少一些库。谢谢你的回答,很抱歉这么晚才回复。
    • 很高兴听到它成功了!请点击答案旁边的小“勾”接受,让大家知道是对的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多