使用Apache POI读取Android中的Excel文件的依赖关系

我想用Apache POI来读写Android中的excel文件(包括xlsx和xls)。 但我无法解决我目前的依赖问题。

如果我在我的gradle文件中只有这两个依赖项

compile files('libs/poi-3.12-20150511.jar') compile files('libs/poi-ooxml-3.12-20150511.jar') 

然后我得到以下错误:

  java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/xmlbeans/XmlOptions; at org.apache.poi.POIXMLDocumentPart.<clinit>(POIXMLDocumentPart.java:59) at com.gargzdai.spreadsheet.MainActivity.readData(MainActivity.java:131) at com.gargzdai.spreadsheet.MainActivity.prepareForReadingData(MainActivity.java:109) at com.gargzdai.spreadsheet.MainActivity.onCreate(MainActivity.java:68) at android.app.Activity.performCreate(Activity.java:5990) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) at android.app.ActivityThread.access$800(ActivityThread.java:151) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5254) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 

这是我用来读取excel文件的代码:

  if (isXlsxFile) myWorkbook = new XSSFWorkbook(OPCPackage.open(file)); else myWorkbook = new HSSFWorkbook(fileStream); Sheet mySheet = myWorkbook.getSheetAt(0); Iterator rowIterator = mySheet.rowIterator(); 

看来我应该添加xmlbeans库。 在将这个依赖添加到我的gradle文件之后:

 compile files('libs/xmlbeans-2.6.0.jar') 

在我添加这个依赖项后,在gradle构build过程中出现以下错误:

 Error:Execution failed for task ':app:preDexDebug'. > com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'C:\Program Files\Java\jdk1.8.0_40\bin\java.exe'' finished with non-zero exit value 1 

任何想法,我应该如何处理这个问题?

我面临同样的问题。 org.apache.poi:poi-ooxml在stax:stax-api的末尾引用,其中包含核心软件包javax.xml。*。 编译器(或者predexer或者是在android studio中调用的)会用长的警告中止编译。 有三种方法可以解决这个问题:

  1. 使用另一个库比poi, 如果有任何也支持xlsx
  2. 重新编译依赖关系。 我开始重新编译stax-api。 你需要用类似jarjar这样的工具来更改类的包名,这也是在android studio的错误输出中提到的。 问题是:你还必须重新编译引用和使用stax-api的xmlbeans库。 此时我放弃了。
  3. 在编译期间设置–core-library开关。 这是不推荐的,因为人们可以看到androids错误消息。 不过, 这里是讨论如何工作。 这样做,你还应该重新编译stax-api并删除android.jar中定义的所有类(javax.xml.XMLConstants,javax.xml.namespace。*)

希望有所帮助!