Читаем XLSX на Android при помощи Apache POI
Сама по себе задача прочитать формат XLSX при помощи Apache POI XSSF совершенно не хитрая. Не хитрая ровно до тех пор, пока вы не решите подключить эту библиотеку к вашему приложению для Android. К сожалению, гугление ни к чему не привело — мне не удалось найти реальных инструкций или рекомендаций по использованию XSSF на Android. Вообще ни одного упоминания о том, что эта библиотека действительно может работать на Android.HSSF (XLS) — работает без проблем, XSSF (XLSX) — не удалось ничего найти, только рекомендации обрабатывать все при помощи POI где-нибудь на сервере.
Далее раскрываю, в чем заключается проблема и как я её решил :
Дело в том, что в Android есть ограничение на 65К методов в приложении, а для работы XSSF необходим jar, содержащий Open XML Schemas, в котором даже в сокращенной версии для POI содержится около 67К методов.
Напрашивается мысль, что можно все это дело попытаться уменьшить при помощи proguard. Однако почему-то никак не получалось сократить всю библиотеку так, чтобы приложение работало.
В итоге саму библиотеку уменьшил при помощи proguard, а схемы — вручную. Просто при помощи архиватора удалил из jar со схемами все файлы, которые, на мой взгляд, не нужны для чтения XLSX, после этого раз за разом запускал приложение, пытался читать файл и добавлял классы из-за отсутствия которых приложение падало. В конце концов — заработало!
Пример работающего приложения можно найти на GitHub: github.com/andruhon/AndroidReadXLSX
Для работы библиотеки и её зависимостей необходимы классы из javax, которых, к сожалению, нет в Android.Здесь нас спасает stax-api-1.0.1.jar, однако для того, чтобы скомпилировать приложение придется добавить опцию --core-library к DX.
Использованный конфиг proguard (по большему счету делает только '-shrink'):[на входе dom4j-1.6.1.jar, poi-3.10-FINAL-20140208.jar, poi-ooxml-3.10-FINAL-20140208.jar, xmlbeans-2.3.0.jar]
-injars {директория с jar файлами библиотеки содержащая} -outjars poi-min.jar
-libraryjars {директория со схемами} -libraryjars {path to /jre/lib} -libraryjars {path to /jdk/lib}
-dontoptimize -dontobfuscate -ignorewarnings
-keep class org.apache.poi.xssf.** { *; } -keep class org.apache.poi.ss.** { *; } -keep class org.apache.poi.hssf.** { *; } -keep class org.apache.xmlbeans.** { *; }