当前位置: 首页 > 知识库问答 >
问题:

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

曾洲
2023-03-14
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.");
        }
    }
}
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的Office2007+文件中阅读这个奇妙的“\005SummaryInformation”吗?我有一种感觉,当Office2007格式出现时,源代码的作者们把api结构抛在了脑后,开始了一个新的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
    null

我花了4天的时间来寻找这个问题(也就是重新移植库和设置路径变量),但是我头晕了,我没有时间去处理这个似乎一点都不清楚的问题。我甚至检查了导入的库的完整性(我确保.class文件存在于JAR中)。

共有1个答案

朱通
2023-03-14

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中,您可以访问所有内置属性和自定义属性!

 类似资料:
  • 问题内容: 在angularJS中,如何从属性文件中读取值? app.js: 问题答案: 如果是驻留在Web服务器上的文件,则只需执行以下操作: 您可以在此处查看示例: http://plnkr.co/edit/3Ne3roFOwcfVmg2mgnUr?p=preview

  • 问题内容: 我创建了一个REST Web服务,在其中创建了config.properties文件来存储和检索整个应用程序中的一些用户名和密码。我将其存储在/src/main/resources/config.properties中。 当我尝试从eclipse的Java代码加载它时,它工作正常。但是当我将它部署在tomcat中时,它没有加载。我用来加载属性文件的代码是 谁能帮我解决这个问题 问题答案

  • 问题内容: 我有以下代码尝试读取属性文件: 我在最后一行有一个例外。特别: 问题答案: 根据你的异常,该值为null,这意味着类加载器未找到你的属性文件。我猜测myProp.properties位于项目的根目录中,如果是这种情况,则需要前面的斜杠:

  • 我需要从属性文件加载数据源属性 db.properties: 这是数据源(camelcontext.xml): 我试着这样做,但没用。 我的路由是在java dsl中实现的。

  • 问题内容: 我正在用弹簧。我需要从属性文件中读取值。这是内部属性文件,而不是外部属性文件。属性文件可以如下。 我需要以传统方式从属性文件中读取这些值。如何实现呢?Spring 3.0是否有最新方法? 问题答案: 在你的上下文中配置PropertyPlaceholder: 然后,你引用bean中的属性: 编辑:更新了代码以使用逗号分隔的多个值来解析属性: 如果那不起作用,则可以定义一个带有属性的be

  • 问题内容: 我是jquery的新手。我想使用JavaScript或jquery读取jsp页面中的Java属性文件。我对此进行了调查,但并不满意。 我的应用程序是由Struts2,Eclipse Juno和Windows7开发的。这是我的javascript 这是我的属性文件 我想从属性文件中读取 确认 和 警报 框值。那么是否可以使用Ajax或jquery或javascript? 问题答案: 一个