2017-04-27 222 views
0

我們正在嘗試使用apache POI讀取xlsx文件。每件事情都很好。但有時當我們上傳一個xlsx文件時,它會給出下面的錯誤。Apache POI XSSF加載問題

java.io.IOException: Unable to parse xml bean 
    at org.apache.poi.POIXMLTypeLoader.parse(POIXMLTypeLoader.java:118) 
    at org.openxmlformats.schemas.spreadsheetml.x2006.main.WorkbookDocument$Factory.parse(Unknown Source) 
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.onDocumentRead(XSSFWorkbook.java:347) 
    at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:190) 
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:290) 
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:720) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:280) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655) 
    at io.vertx.core.eventbus.impl.HandlerRegistration.deliver(HandlerRegistration.java:213) 
    at io.vertx.core.eventbus.impl.HandlerRegistration.handle(HandlerRegistration.java:192) 
    at io.vertx.core.eventbus.impl.EventBusImpl.lambda$deliverToHandler$3(EventBusImpl.java:503) 
    at io.vertx.core.impl.ContextImpl.lambda$wrapTask$3(ContextImpl.java:359) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: org.xml.sax.SAXParseException: The prefix "x15" for element "x15:workbookPr" is not bound. 
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source) 
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) 
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source) 
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source) 
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source) 
    at javax.xml.parsers.DocumentBuilder.parse(Unknown Source) 
    at org.apache.poi.util.DocumentHelper.readDocument(DocumentHelper.java:137) 
    at org.apache.poi.POIXMLTypeLoader.parse(POIXMLTypeLoader.java:115) 
    ... 25 common frames omitted 

如果我們將相同的內容複製到另一個xlsx文件並上傳它,一切工作正常。我們無法確定此錯誤的根本原因。感謝任何幫助/建議。

罐使用: POI-3.16.jar POI-OOXML-3.16.jar POI-OOXML-架構 - 3.16.jar

更新:

即使POI版本3.14,我們正在以下例外:

org.apache.poi.POIXMLException: org.apache.xmlbeans.XmlException: error: Use of undefined namespace prefix: x15 
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.onDocumentRead(XSSFWorkbook.java:402) 
    at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:178) 
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:249) 
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:302) 
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:720) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:280) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655) 
    at io.vertx.core.eventbus.impl.HandlerRegistration.deliver(HandlerRegistration.java:213) 
    at io.vertx.core.eventbus.impl.HandlerRegistration.handle(HandlerRegistration.java:192) 
    at io.vertx.core.eventbus.impl.EventBusImpl.lambda$deliverToHandler$3(EventBusImpl.java:503) 
    at io.vertx.core.impl.ContextImpl.lambda$wrapTask$3(ContextImpl.java:359) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: org.apache.xmlbeans.XmlException: error: Use of undefined namespace prefix: x15 
    at org.apache.xmlbeans.impl.store.Locale$SaxLoader.load(Locale.java:3499) 
    at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1277) 
    at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1264) 
    at org.apache.xmlbeans.impl.schema.SchemaTypeLoaderBase.parse(SchemaTypeLoaderBase.java:345) 
    at org.apache.poi.POIXMLTypeLoader.parse(POIXMLTypeLoader.java:92) 
    at org.openxmlformats.schemas.spreadsheetml.x2006.main.WorkbookDocument$Factory.parse(Unknown Source) 
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.onDocumentRead(XSSFWorkbook.java:336) 
    ... 24 common frames omitted 

代碼初始化xlsx的讀取。這其中我們得到此異常:

XSSFWorkbook workbook = new XSSFWorkbook(file); 
+0

你可以試試這個'Workbook workbook = WorkbookFactory.create(file);' –

+0

這也給出了同樣的例外。 – Manjunath

+0

此文件從哪裏來?如果您在Excel中打開該文件並執行另存爲,問題是否消失? – Gagravarr

回答

0

具體這個問題不是關於Apache POI jar文件版本3.16或3.14你提到這一點產生java.io.IOException:無法解析的XML bean和org.apache.poi。 POIXMLException這看起來與您的代碼有關。

+0

我不認爲它與代碼有關。如果我理解正確,poi相關的xml模式文件之一就是拋出這個異常。需要了解爲什麼它無法執行特定的xlsx文件。 – Manjunath

+1

好吧然後你認爲它是關係到poi的XML模式文件,然後報告bug在Apache poi https://bz.apache.org/bugzilla/enter_bug.cgi或請搜索那裏的文檔,你會得到適當的解決方案。 – SQA