В настоящее время я разрабатываю приложение для Android, которое требуется для чтения / записи данных из / в электронную таблицу Excel ( .xls или .xlsx ).
Для интеграции Android <-> Excel я использую эту библиотеку poi , главным образом потому, что у меня были некоторые проблемы с правильной настройкой зависимостей к исходному Apache POI .
Примечание: В случае выполненного действия (нажатия кнопки) создается экземпляр объекта книги как таковой this.workbook = new XSSFWorkbook(super.file);
Ниже приводится содержимое моего build.gradle (модуль) файл:
apply plugin: 'com.android.application
android {
compileSdkVersion 27
defaultConfig {
applicationId "com.ricardomiranda.expenses"
minSdkVersion 24
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
// Workaround - "Program type already present"
dexOptions {
preDexLibraries = false
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation 'com.android.support:design:27.1.1'
// Workaround - "com.bea.xml.stream.EventFactory not found"
implementation('com.fasterxml:aalto-xml:1.0.0'){
// Workaround - "Program type already present"
exclude module: 'stax'
exclude module: 'stax-api'
exclude module: 'xpp3'
exclude group: 'com.android.support'
exclude module: 'support-v7'
exclude module: 'fasterxml'
}
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'
implementation files('libs/poishadow-all.jar')
}`
Как можно заметить, в предыдущем фрагменте кода есть некоторые обходные пути (правильно выделенные в комментариях), чтобы попытаться решить проблемы, с которыми я сталкиваюсь,пока безрезультатно.
Проблемы:
Рассмотрим предыдущий build.gradle фрагмент кода без обходных путей
- Сборка успешно выполнена и приложениезапущен.При нажатии кнопки выполняется вышеупомянутая строка:
this.workbook = new XSSFWorkbook(super.file);
, а также некоторые другие классы и методы, унаследованные от библиотеки poi - эта кнопка пытается записать данные в электронную таблицу Excel.Однако ожидаемое поведение не применяется, так как выполнение прерывается с «фатальным исключением» следующим образом:
`
2019-01-31 18:35:14.377 20682-20682/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.ricardomiranda.expenses, PID: 20682
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:130)
at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:295)
at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:201)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:323)
at com.ricardomiranda.expenses.ExcelManagement.initializeWorkbook(ExcelManagement.java:141)
at com.ricardomiranda.expenses.ExcelManagement.<init>(ExcelManagement.java:51)
at com.ricardomiranda.expenses.AddExpense$1.onClick(AddExpense.java:44)
at android.view.View.performClick(View.java:6291)
at android.view.View$PerformClick.run(View.java:24931)
at android.os.Handler.handleCallback(Handler.java:808)
at android.os.Handler.dispatchMessage(Handler.java:101)
at android.os.Looper.loop(Looper.java:166)
at android.app.ActivityThread.main(ActivityThread.java:7529)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)
Для устранения проблемы ив этом комментарии я добавил следующую зависимость в свою сборку implementation('com.fasterxml:aalto-xml:1.0.0')
и установил необходимые системные свойства (также описанные в разделе Начало работы документации README библиотеки).
Перезапуск приложения после применения прежних изменений приводит к следующей ошибке, на этот раз во время сборки проекта:
Error: Program type already present: com.fasterxml.aalto.ValidationException
Насколько я могу судить, это похоже на Дублированная проблема зависимостей , но я не могу решить gradlew app:dependencies
(вывод слишком обширный), и никакие конфигурации не выводятся аналогичными командами.