Pull to refresh

Читаем XLSX на Android при помощи Apache POI

Reading time 2 min
Views 9.6K
UPD (06.09.2014): Больше нет необходимости компилировать с опцией --core-library
poi logoСама по себе задача прочитать формат 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.

UPD (06.09.2014):
Перекомпилировал StAX предварительно переименовав пространство имен «javax» в «aavax», после этого во всех остальных бинариках *.class заменил все строки 'javax/xml/stream', 'javax/xml/namespace' и 'javax.xml.strings' на соответствующие строки с «aavax». После этого «испорченый» stax-api запаковал в общий jar, все равно по отдельности работать не будет. Теперь вы можете просто скопировать два JAR файла в ваш lib и наслаждаться без дополнительных танцев с бубном.

Использованный конфиг 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.** { *; }
Tags:
Hubs:
+8
Comments 2
Comments Comments 2

Articles