Android Apache POI 读取 Microsoft Word 文档时出错 : org. apache.xmlbeans.SchemaTypeLoaderException 无法解析句柄类型

原文 标签 android kotlin ms-word apache-poi docx

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

Exception: org.apache.xmlbeans.SchemaTypeLoaderException: Cannot resolve type for handle _XY_Q=space|R=space



下面是我的代码(我在第一行收到错误):
var document = XWPFDocument(uri?.let { contentResolver.openInputStream(it) });
var extractor = XWPFWordExtractor(document);
var documentText = extractor.text; // Retrieve the document's text

在运行时,我有以下代码:
super.onCreate(savedInstanceState)
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")

以下是我的 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") {
        exclude group: 'stax', module: 'stax-api'
    }
}

以下是完整的堆栈跟踪:
I/System.out: Exception: org.apache.xmlbeans.SchemaTypeLoaderException: Cannot resolve type for handle _XY_Q=space|R=space@http://www.w3.org/XML/1998/namespace (schemaorg_apache_xmlbeans.system.sF1327CCA741569E70F9CA8C9AF9B44B2.cttext7f5btype) - code 13

重要提示:我试图读入用户选择的 Word 文件的内容,而不是来自硬编码路径的 Word 文件。

请包括 所有 答案中的相关代码,以及您的代码 应该适用于 Android API 22 .

最佳答案

lib 的所有者在这里。 poi-android仅使用 Excel 文件进行过测试,并且经过量身定制,可与 proguard 配合使用,以最大限度地减少我编写的应用程序的二进制大小。

如果让我猜的话,this导致您的问题。对于更通用的 POI 版本,请使用 https://github.com/centic9/poi-on-android (这是我的库所基于的)。您必须包含来自 releases section 的 JAR到您的源代码树中并添加此 Gradle 依赖项:implementation files('path/to/file.jar') .但是,您会注意到,lib 非常大(13MB+),因此将 POI 修改为我的用例背后的原因。我建议 fork 其中一个库并根据您的用例进行定制。

关于Android Apache POI 读取 Microsoft Word 文档时出错 : org. apache.xmlbeans.SchemaTypeLoaderException 无法解析句柄类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60134114/

相关文章:

android - 如何通过集成数据绑定(bind)android更改现有代码

java - 当Cardview移出屏幕时,Recyclerview无法正常工作

java - 停止 SwipeRefreshLayout 刷新动画,尽管 setRefresh(false)/isRefreshing=false

excel - 检查剪贴板是否是图像

java - 无法在Android中编辑裁剪的照片

java - 将java方法转换为kotlin。返回一个lambda表达式

junit - 如何使用 Koin 注入(inject) @BeforeClass 静态方法?

c# - Microsoft Word Automation/互操作Win32 API问题

ms-word - 如何在 Word 2010 中将所有标题部分合并/合并为一个标题部分

android - 使用 fragment 在选项卡中启动 Activity