使用POI導入EXCEL報java.lang.IncompatibleClassChangeError


使用POI導入xls格式的excel報java.lang.IncompatibleClassChangeError異常,而導入xlsx正常。

oracle.apps.fnd.framework.OAException: Application: FND, Message Name: FND_GENERIC_MESSAGE. Tokens: MESSAGE = oracle.jbo.JboException: JBO-29000: Unexpected exception caught: java.lang.IncompatibleClassChangeError, msg=null;  

 

I'm almost certain that you have an older version of POI on your classpath

 基本可以確定,是包含了一個老版本的POI導致的。

 

通過在服務器上編譯,發現此致命錯誤

found : org.apache.poi.hssf.usermodel.HSSFWorkbook
required: org.apache.poi.ss.usermodel.Workbook

 

幾經檢查,都沒有發現有其他版本的POI。最終,參考官方FAQ文檔,

ClassLoader classloader =
   org.apache.poi.poifs.filesystem.POIFSFileSystem.class.getClassLoader();
java.net.URL res = classloader.getResource(
             "org/apache/poi/poifs/filesystem/POIFSFileSystem.class");
String path = res.getPath();
System.out.println("POI Core came from " + path);

classloader = org.apache.poi.POIXMLDocument.class.getClassLoader();
res = classloader.getResource("org/apache/poi/POIXMLDocument.class");
path = res.getPath();
System.out.println("POI OOXML came from " + path);

classloader = org.apache.poi.hslf.HSLFSlideShow.class.getClassLoader();
res = classloader.getResource("org/apache/poi/hslf/HSLFSlideShow.class");
path = res.getPath();
System.out.println("POI Scratchpad came from " + path);

定位到原因是以前有人將POI包直接解壓到了JAVA_TOP路徑下,所以和我的產生了沖突。

啊,多么痛的領悟。

再三檢查,靠,那哥們兒解壓的POI已經不知道是哪個年月的版本的了。

心中真是有一萬個草泥馬在狂飆。真想揪出來打一頓。

 

終極大招:

將java源文件丟到服務器上編譯,根據報錯再一個個導入class文件。

 

好不容易編譯時通過,結果報了運行時異常:

oracle.apps.fnd.framework.OAException: Application: FND, Message Name: FND_GENERIC_MESSAGE. Tokens: MESSAGE = oracle.jbo.JboException: JBO-29000: Unexpected exception caught: java.lang.NoSuchMethodError, msg=org/apache/poi/poifs/filesystem/POIFSFileSystem.getRoot()Lorg/apache/poi/poifs/filesystem/DirectoryNode;;  

Exception  in  thread "main" java.lang.NoSuchMethodError: org/apache/poi/POIDocument.<init>(Lorg/apache/poi/poifs/filesystem/DirectoryNode;)V

最后才發現是poi中各jar版本沖突 ,例如 其他包都是用的3.8的,但是poi.jar用的是3.6的版本,所以就報錯了,將3.6的刪掉,加入3.8的版本即可。

最后,迫不得已,放出最后殺招:將那哥們兒的先備份了,然后直接刪除。

 

參考資料:

java.lang.IncompatibleClassChangeError:

POI 3.7 java.lang.IncompatibleClassChangeError when instantiating a Font

Frequently Asked Questions

提取文本內容二:提取word格式文檔內容


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM