Android Apache Ошибка POI при чтении документа Microsoft Word: org. apache .xmlbeans.SchemaTypeLoaderException Не удается разрешить тип для дескриптора - PullRequest
3 голосов
/ 09 февраля 2020

Я пытаюсь использовать Apache POI в своем приложении Android, чтобы я мог читать файлы Microsoft Word. Я интегрирую библиотеку POIA, которая позволяет использовать Apache POI для Android (https://github.com/SUPERCILEX/poi-android). Однако, когда я запускаю свой код и читаю в файле Word, я получаю следующую ошибку:

Исключение: org. apache .xmlbeans.SchemaTypeLoaderException: Не удается разрешить тип для дескриптора _XY_Q = space | R = пробел

Ниже мой код (я получаю сообщение об ошибке в первой строке):

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 по жестко заданному пути.

Пожалуйста, включите ALL соответствующий код в вашем ответе, и ваш код должен работать на Android API 22 * ​​1032 *.

Ответы [ 2 ]

6 голосов
/ 15 февраля 2020

владелец библиотеки здесь. poi-android был протестирован только с файлами Excel и специально предназначен для работы с proguard, чтобы минимизировать двоичный размер для приложения, которое я написал.

Если бы мне пришлось угадывать, это вызывает ваше вопрос. Для более общей c версии POI используйте https://github.com/centic9/poi-on-android (именно на этом основана моя библиотека). Вам нужно будет включить JAR из раздела release в ваше дерево исходников и добавить эту зависимость Gradle: implementation files('path/to/file.jar'). Тем не менее, как вы заметите, библиотека довольно большая (13 МБ +), отсюда и причина изменения POI для моего варианта использования. Я бы порекомендовал разветвить одну из библиотек и адаптировать ее к вашему случаю использования.

1 голос
/ 18 февраля 2020

Вы добавили packagingOptions в build.gradle?

packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
    }

Также включите multiDexEnabled

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...