簡體   English   中英

無法使用Apache POI 3.14讀取XLSX文件

[英]Unable to read XLSX file using Apache POI 3.14

我能夠在基於OSGI的應用程序中正確讀取XLS文件,但是當我嘗試讀取XLSX文件時,我收到以下錯誤。

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"));  

我在線嘗試了各種解決方案,告訴我要排除某些artifactID,例如:stax-api和stax。 但是沒有一個解決方案似乎有效。

問題似乎是有兩個bundle導出包javax.xml.stream 似乎org.apache.xerces.stax.XMLEventFactoryImpl連接到其中一個軟件包,而您的軟件包連接到另一個軟件包。 因此,即使它們的名稱相同,他們也看不到相同的類。

為避免這種情況,請確保只有一個捆綁包導出此包。 實現此目的的一種方法是從系統包中導出包,因為它應該存在於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

我使用此代碼打開XLSX文件沒有問題:

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

我不知道輸入流是否是必要的,但它肯定能完成這項工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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