加载XLSX文件

时间:2019-05-11 08:54:24

标签: java android excel apache-poi

我已经在Java桌面应用程序上成功使用了Apache POI,并且想在Android上使用它来读写Excel文件。

这是我的Github存储库: https://github.com/anta40/StockChecker

每次我尝试打开XLSX文件时,最终由于以下原因导致应用程序崩溃

  

org.apache.poi.javax.xml.stream.FactoryConfigurationError:提供程序   找不到com.bea.xml.stream.EventFactory

这是我的build.gradle的内容:     应用插件:“ com.android.application”

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.anta40.app.stockchecker"
        minSdkVersion 15
        targetSdkVersion 28
        multiDexEnabled true
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support:multidex:1.0.3'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'com.github.SUPERCILEX.poi-android:poi:3.17'
    implementation 'com.github.angads25:filepicker:1.1.1'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

如何解决此问题?

在build.gradle上添加此行:

  

实现'com.fasterxml:aalto-xml:1.1.0'

不起作用。您会收到很多类似这样的错误消息:

  

重复的班级   org.codehaus.stax2.ri.typed.ValueDecoderFactory $ IntDecoder位于   模块poi-3.17.jar(com.github.SUPERCILEX.poi-android:poi:3.17)和   stax2-api-4.1.jar(org.codehaus.woodstox:stax2-api:4.1)复制   org.codehaus.stax2.ri.typed.ValueDecoderFactory $ IntegerDecoder类   在模块poi-3.17.jar中找到   (com.github.SUPERCILEX.poi-android:poi:3.17)和stax2-api-4.1.jar   (org.codehaus.woodstox:stax2-api:4.1)重复的类   找到org.codehaus.stax2.ri.typed.ValueDecoderFactory $ LongArrayDecoder   在模块poi-3.17.jar(com.github.SUPERCILEX.poi-android:poi:3.17)中   和stax2-api-4.1.jar(org.codehaus.woodstox:stax2-api:4.1)复制   org.codehaus.stax2.ri.typed.ValueDecoderFactory $ LongDecoder类   在模块poi-3.17.jar中找到   (com.github.SUPERCILEX.poi-android:poi:3.17)和stax2-api-4.1.jar   (org.codehaus.woodstox:stax2-api:4.1)重复的类   org.codehaus.stax2.ri.typed.ValueDecoderFactory $ QNameDecoder在以下位置找到   模块poi-3.17.jar(com.github.SUPERCILEX.poi-android:poi:3.17)和   stax2-api-4.1.jar(org.codehaus.woodstox:stax2-api:4.1)复制   在模块中找到的类org.codehaus.stax2.ri.typed.ValueEncoderFactory   poi-3.17.jar(com.github.SUPERCILEX.poi-android:poi:3.17)和   stax2-api-4.1.jar(org.codehaus.woodstox:stax2-api:4.1)

3 个答案:

答案 0 :(得分:3)

只需在 build.gradle 模块中包含这些依赖项:

Instance_Destination

不要使用最新版本的依赖项,因为它们会产生更多错误。

答案 1 :(得分:0)

在您的依赖项中扩展此stax2-api-4.1.jar并重建项目

答案 2 :(得分:0)

感谢 Animesh Sharma 的回答。

但是,您应该扩展 Application 类并将其添加到那里以避免任何代码重复。

class AppController : Application() {

    init {
        System.setProperty(
            "org.apache.poi.javax.xml.stream.XMLInputFactory",
            "com.fasterxml.aalto.stax.InputFactoryImpl"
        );
        System.setProperty(
            "org.apache.poi.javax.xml.stream.XMLOutputFactory",
            "com.fasterxml.aalto.stax.OutputFactoryImpl"
        );
        System.setProperty(
            "org.apache.poi.javax.xml.stream.XMLEventFactory",
            "com.fasterxml.aalto.stax.EventFactoryImpl"
        );
    }
}

也不要忘记将其添加到清单。 在 中添加 android:name=".AppController"