![](/img/trans.png)
[英]Java POI the supplied data appears to be in the Office 2007+ XML
[英]Apache POI, Excel 2007+ XML, and OSGI
对于一个项目,我正在尝试使用 Apache POI 获得 Excel XML 功能以与 OSGI 一起使用。
我已经尝试过 POI ServiceMix 包,但是缺少 ooxml-schemas jar。 将 jar 添加到捆绑包并将其包含在清单中似乎不起作用。
然后我尝试为 POI 3.10 创建包装包,但也无济于事。 同样的错误。
Caused by: java.lang.ClassNotFoundException: org.apache.xmlbeans.impl.schema.SchemaTypeSystemImpl not found by org.apache.poi [8]
at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1532)
at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:75)
at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1955)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
... 105 more
后续调用会导致以下结果:
Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.openxmlformats.schemas.drawingml.x2006.main.ThemeDocument
at org.openxmlformats.schemas.drawingml.x2006.main.ThemeDocument$Factory.parse(Unknown Source)
at org.apache.poi.xssf.model.ThemesTable.<init>(ThemesTable.java:44)
... 93 more
XMLBeans 可以作为一个包导出它的所有包,我已经尝试了 ServiceMix 包以及从 POI 3.10 包含的 jar 中制作一个包。
有人可以指导我完成创建可以处理 Excel 2007+ XML 文档的工作 OSGI 包的过程吗? 非常感谢帮助。
问题是来自org.apache.poi.ooxml-schemas
的类调用Class.forName("org.apache.xmlbeans.impl.schema")
,所以你需要在你的 ooxml-schemas 清单中导入这个包捆。
我通过在构建 ooxml-schemas 包时将<DynamicImport-Package>*</DynamicImport-Package>
到maven-bundle-plugin
的配置来解决它。
我们使用一个合并poi
、 poi-ooxml
和poi-ooxml-schemas
来解决类加载问题。
为此,我们将 Gradle 与bnd-platform 结合使用。 它允许基于 Maven 依赖项构建和调整 OSGi 包。 也可以轻松地将 JAR 合并到组合包中。
我在 GitHub 上设置了一个带有 Apache POI 包(以及其 POM 定义的依赖项)的示例构建。 它是为基于 OSGi 的应用程序构建完整目标平台的摘录或自己的配置。
您可以克隆它( sample-poi分支)并尝试运行./gradlew clean bundles
。 创建的包将在build/plugins
。
Caused by: java.lang.ClassNotFoundException:
org.apache.xmlbeans.impl.schema.SchemaTypeSystemImpl
not found by org.apache.poi [8]
这意味着,包内代码org.apache.poi
外观类SchemaTypeSystemImpl
包的org.apache.xmlbeans.impl.schema
并不能找到它。 鉴于类和包看起来都像实现类,我假设它们不能在包外访问是正确和正确的。
您能否为第一个异常添加完整的堆栈跟踪,以便Class.forName()
的调用站点可见? 这很可能只是配置问题的下游,但这将有助于缩小问题的范围。
通过将以下包添加到运行包中,我能够在 OSGi 中使用 poi 库:
* org.apache.servicemix.bundles.poi
* org.apache.servicemix.bundles.xmlbeans
* Commons-collections4
* 公共压缩
* commons-math3
* 撒克逊 DOM 8.9.0.4-osgi
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.