2017-08-01 290 views
2

阅读XLSX文件,我能够在我的基于OSGi应用程序正确读取XLS文件,但是当我尝试读取XLSX文件,我得到以下错误。无法使用Apache POI 3.14

Caused by: java.lang.ExceptionInInitializerError 
    at org.apache.poi.openxml4j.opc.OPCPackage.init(OPCPackage.java:162) 
    at org.apache.poi.openxml4j.opc.OPCPackage.<init>(OPCPackage.java:142) 
    at org.apache.poi.openxml4j.opc.Package.<init>(Package.java:37) 
    at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:128) 
    at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:257) 
    at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:291)[242:export_poi.jar:0.0.0] 
    at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:252)[242:export_poi.jar:0.0.0] 
    at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:231)[242:export_poi.jar:0.0.0] 
    at mycom.project2.ExcelAdapter.Sources.Source.readExcelFile(Source.java:67)[232:ExcelAdapter:1.0.0] 
    at mycom.project2.ExcelAdapter.Sources.Source.<init>(Source.java:56)[232:ExcelAdapter:1.0.0] 
    at mycom.project2.ExcelAdapter.Sources.SourcesManager.addSource(SourcesManager.java:55)[232:ExcelAdapter:1.0.0] 
    at mycom.project2.ExcelAdapter.Sources.SourcesManager.addSources(SourcesManager.java:48)[232:ExcelAdapter:1.0.0] 
    at mycom.project2.ExcelAdapter.Processors.Engine.setResourceConfig(Engine.java:44)[232:ExcelAdapter:1.0.0] 
    at mycom.project2.ExcelAdapter.ExcelAdapter.configureBusinessLogic(ExcelAdapter.java:164)[232:ExcelAdapter:1.0.0] 
    at mycom.project1.function_engine_tooling.fb.libraries.FunctionBlockType.addFunctionBlockInstance(FunctionBlockType.java:161)[234:fb-libraries:1.0.0] 
    at mycom.project1.function_engine_tooling.fb.libraries.FunctionBlockType.handleCreateFbInstances(FunctionBlockType.java:373)[234:fb-libraries:1.0.0] 
    at mycom.project1.function_engine_tooling.fb.libraries.FunctionBlockType.onMessageReceived(FunctionBlockType.java:197)[234:fb-libraries:1.0.0] 
    at mycom.project2.ExcelAdapter.ExcelAdapterInstanceFactory.onMessageReceived(ExcelAdapterInstanceFactory.java:46)[232:ExcelAdapter:1.0.0] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)[:1.8.0_131] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)[:1.8.0_131] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)[:1.8.0_131] 
    at java.lang.reflect.Method.invoke(Method.java:498)[:1.8.0_131] 
    at org.apache.camel.component.bean.MethodInfo.invoke(MethodInfo.java:408) 
    at org.apache.camel.component.bean.MethodInfo$1.doProceed(MethodInfo.java:279) 
    at org.apache.camel.component.bean.MethodInfo$1.proceed(MethodInfo.java:252) 
    ... 19 more 
Caused by: java.lang.ClassCastException: org.apache.xerces.stax.XMLEventFactoryImpl cannot be cast to javax.xml.stream.XMLEventFactory 

我使用这个命令来读取文件:

WorkbookFactory.create(new File("fileName")); 

我在网上尝试了各种解决方案,它告诉我排除某些artifactIDs e.g:STAX的API和STAX。但是这些解决方案似乎都没有奏效。

+0

您是否使用'“fileName.fileExtension”'? – Sedrick

+0

是的,我的文件以“excelfile.xls”或“excelfile.xlsx”形式出现。 – CoderX

+0

发布更多验证码。 – Sedrick

回答

0

我打开XLSX文件与此代码没有问题:

InputStream inp = new FileInputStream(inputfilename); 
    Workbook wb = WorkbookFactory.create(inp); 
    // Open the specified sheet 
    Sheet inputsheet = wb.getSheetAt(sheetindex); 

我不知道,如果一个InputStream是必要的,但它绝对做工作。

+0

我已经使用这个为好,但它给了我同样的错误。 :( – CoderX

+1

那么看来你是错铸造变量:'ClassCastException异常:org.apache.xerces.stax.XMLEventFactoryImpl不能转换到javax.xml.stream.XMLEventFactory'什么线是引发此错误您发布的一个? ? –

+0

是的,我也更新了错误的更多的解释我正在寻找更多的代码的问题。 – CoderX

2

这个问题似乎是有一些导出包javax.xml.stream两捆。看起来,org.apache.xerces.stax.XMLEventFactoryImpl连接到这些软件包之一,而你的软件包连接到另一个软件包。所以即使他们的命名相同,他们也不会看到相同的类。

为了避免这种情况,请确保只有一个包导出此包。达到此目的的一种方法是export the package from the system bundle,因为它应该存在于jre中。

至少对于apache karaf来说安装很简单。使用这些软件包:

install -s mvn:commons-codec/commons-codec/1.10 
install -s mvn:org.apache.commons/commons-collections4/4.1 
install -s mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.poi/3.16_1 
+0

在仔细检查后,我发现CLASS'javax.xml.stream.XMLEventFactory'由其他BUNDLE ** poiDependencies.jar **提供(必须实际使用它,因为我已将所有相关的POI依赖项导出到单独的JAR)以及OSGI lib(通过** xerces-2.11.0.jar **)。根据你的asnwer,错误是,而不是从** poiDependencies.jar **使用CLASS,ServiceMix使用它从** xerces-2.11.0.jar ** ??我尝试从** xerces-2.11.0.jar **中删除CLASS,但它是ServiceMix内部需要的(因为它产生了一个错误)。我怎样才能解决这个问题? – CoderX

+0

您是否尝试过我的答案中的包? –

+0

** commons-codec **已经安装,我安装了另外两个软件包,但它给出了相同的错误。 – CoderX