【问题标题】:Android POI Error when reading Microsoft Word document: Provider com.bea.xml.stream.EventFactory not found读取 Microsoft Word 文档时出现 Android POI 错误:未找到提供程序 com.bea.xml.stream.EventFactory
【发布时间】:2020-01-30 23:26:51
【问题描述】:

我正在尝试在我的 Android 应用程序中使用 Apache POI,以便可以读取 MS Word 文件。我正在集成 POIA 库,它可以在 Android (https://github.com/SUPERCILEX/poi-android) 上使用 Apache POI。但是,当我运行代码并读取 Word 文件时,我收到以下错误:

org.apache.poi.javax.xml.stream.FactoryConfigurationError: Provider com.bea.xml.stream.EventFactory 未找到

下面是我的代码(我在第一行收到错误):

var document = XWPFDocument(uri?.let { contentResolver.openInputStream(it) });
var extractor = XWPFWordExtractor(document);
var documentText = extractor.text; // Retrieve the document's text

以下是我的 gradle(项目级):

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    ext.kotlin_version = '1.3.60'
    repositories {
        google()
        jcenter()

    }
    ext {
        poiVersion = '3.17'
    }
    dependencies {
        classpath 'com.android.tools:r8:1.4.93'
        classpath 'com.android.tools.build:gradle:3.4.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        maven { url 'https://jitpack.io' }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

以下是我的 gradle(应用级):

apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.2"
    defaultConfig {
        applicationId "com.example.diffchecker"
        minSdkVersion 21
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.core:core-ktx:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    // For developers using the Android Support Library
    implementation 'pub.devrel:easypermissions:2.0.1'
    implementation 'com.google.android.gms:play-services-ads:18.3.0'
    implementation "com.github.SUPERCILEX.poi-android:poi:$poiVersion"
}

下面是完整的堆栈跟踪:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.diffchecker, PID: 2292
    org.apache.poi.javax.xml.stream.FactoryConfigurationError: Provider com.bea.xml.stream.EventFactory not found
        at org.apache.poi.javax.xml.stream.FactoryFinder.newInstance(FactoryFinder.java:72)
        at org.apache.poi.javax.xml.stream.FactoryFinder.find(FactoryFinder.java:178)
        at org.apache.poi.javax.xml.stream.FactoryFinder.find(FactoryFinder.java:92)
        at org.apache.poi.javax.xml.stream.XMLEventFactory.newInstance(XMLEventFactory.java:30)
        at org.apache.poi.openxml4j.opc.internal.marshallers.PackagePropertiesMarshaller.<clinit>(PackagePropertiesMarshaller.java:41)
        at org.apache.poi.openxml4j.opc.OPCPackage.init(OPCPackage.java:161)
        at org.apache.poi.openxml4j.opc.OPCPackage.<init>(OPCPackage.java:141)
        at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:97)
        at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:324)
        at org.apache.poi.util.PackageHelper.open(PackageHelper.java:37)
        at org.apache.poi.xwpf.usermodel.XWPFDocument.<init>(XWPFDocument.java:116)
        at com.example.diffchecker.MainActivity.onActivityResult(MainActivity.kt:249)
        at android.app.Activity.dispatchActivityResult(Activity.java:7759)
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4598)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:4647)
        at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:49)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1948)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7045)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:964)

【问题讨论】:

  • var document = XWPFDocument()uri?.let{contentResolver.openInputStream(it.document)};仅当值为非 null 时才会调用 let 函数,因此您将参数用作 lambda 的非 null 参数:email?.let { email -> sendEmailTo(email) }
  • 这不是重复的吗? stackoverflow.com/questions/56088744/…
  • @Antonio 我收到以下错误:未解决的参考:文档

标签: android kotlin apache-poi


【解决方案1】:

我成功地运行了一个与你的配置相似的应用程序。

  1. 首先,我从 poi-android 中排除了 stax,因为它可能已过时(因此会导致问题),Java 6 及更高版本实际上不再需要它。

app/build.gradle

implementation ("com.github.SUPERCILEX.poi-android:poi:$poiVersion") {
    exclude group: 'stax', module: 'stax-api'
}
  1. 其次,在我的Application类中,我更新了3个系统属性如下:

MainApplication.kt

override fun onCreate() {
    super.onCreate()
    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")
    ...
}
  1. 最后,我构建并运行了应用程序 -> 成功打开。

【讨论】:

  • 这会在我打开word文档时出现以下错误:org.apache.poi.javax.xml.stream.FactoryConfigurationError: Provider com.bea.xml.stream.EventFactory not found
  • @AdamLee 所以,你原来的问题已经变成了运行时崩溃,对吧?
【解决方案2】:

通过将其添加到应用程序的 gradle 中,包括 Aalto,一个开源 JSR173 提供程序

implementation group: 'com.fasterxml', name: 'aalto-xml', version: '1.0.0'

然后 POI 将 Aalto 与以下代码一起使用(将其放在我的应用程序的 onCreate() 中,但我假设在使用 Poiji 之前的其他任何地方也可以。

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

现在我的应用可以正确读取 XLSX 文件

【讨论】:

  • 不幸的是,这不起作用。我正在尝试读取 word 文件,而不是 excel 文件。
  • 如果是来自内容解析器错误,请尝试以下解决方案:stackoverflow.com/a/43994632/6160172
【解决方案3】:

这是 Android 上的常见问题,因为不支持此 Java 类:

未找到提供者com.bea.xml.stream.EventFactory

您必须添加 com.fasterxml:aalto-xml 并排除 stax2-api-4.1.jar

// implementation "com.fasterxml:aalto-xml:1.1.0"
implementation ("com.github.SUPERCILEX.poi-android:poi:3.17" {
    exclude group: "org.codehaus.woodstox", module: "stax2-api"
}

然后更新系统属性:

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

在 Java 中,这将是 static 关键字。在 Kotlin 上 init 应该还早。

【讨论】:

  • init 是在项目级还是应用级 gradle 中?
  • 我现在在运行您列出的新实现后尝试同步 gradle 时收到以下错误:找不到方法 com.github.SUPERCILEX.poi-android:poi:3.17() for arguments [build_difqk8gm93tw0xwozq61wfhvq$_run_closure2$_closure7@71491403] 在 org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler 类型的对象上。
  • 这个问题已经在这里很久了stackoverflow.com/questions/56088744/…
  • @AdamLee 系统属性需要在运行时更新,使用 Kotlin 或 Java。
  • @MartinZeitler 这会导致以下错误:在模块 aalto-xml-1.1.0.jar (com.fasterxml:aalto-xml:1.1.0) 中找到重复的类 com.fasterxml.aalto.AsyncByteArrayFeeder ) 和 poi-3.17.jar (com.github.SUPERCILEX.poi-android:poi:3.17)
猜你喜欢
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
  • 2022-12-06
  • 1970-01-01
相关资源
最近更新 更多