2011-12-13 15 views
13

Estoy buscando una versión ligera de poi-3.8.jar para usarla en una aplicación de Android (privada). No parece ser capaz de caber todo el frasco de 1.7Mb en el APK por alguna razón (y sería incorrecto hacerlo de todos modos) y ya que solo estoy buscando el doc -> html y xls -> funcionalidad html, no estoy seguro de necesitar el archivo jar completo.Intentando portar Apache POI a Android

He pasado un par de horas tratando de averiguar cómo extraer org.apache.poi.hwpf.converter.WordToHtmlExtracter.java en poi/hwpf/converter, pero parece que está usando muchas otras cosas. Incluso si esto realmente no me sorprende, pensé que tal vez alguien aquí sabría de qué paquetes puedo deshacerme para hacer que el frasco sea más pequeño. Estaré encantado de dedicarle más tiempo, a menos que alguien aquí me diga que es una pérdida de tiempo y que TODO en las fuentes es necesario para convertir documentos doc a html.

No necesito nada que muestre algo, solo necesito las funciones "simples" de doc to html (y xls to html if possible). No necesito nada relacionado con PDF, PowerPoint, Outlook o lo que sea.

estaré encantado de compartir lo averiguo

Saludos

Respuesta

7

Bueno, yo era capaz de hacer más de lo que yo estaba pidiendo aquí. Eso es importar los archivos jar. Tenía al menos 2 tipos de problemas: - no había suficiente RAM en Eclipse que hacía que la mayoría de las veces mis clases estuvieran defectuosas (corregidas ajustando los valores Xmx y xms en Eclipse.ini) - el límite del método de 64k para cada archivo DEX hizo las cosas complicadas. Tuve que dividir todos los frascos de POI requeridos en varios archivos DEX. (Lo hice siguiendo el tutorial del blog de Android: http://android-developers.blogspot.com/2011/07/custom-class-loading-in-dalvik.html)

La verdadera respuesta a mi pregunta es: "sí, necesitas todo en el contenedor". Lo hice funcionar para los archivos básicos "no abiertos xml". Mi aplicación hace la conversión a html bastante bien, y también es lo suficientemente rápida.

En una nota lateral, también estaba tratando de hacer lo mismo con los archivos "open XML", y es mucho más complicado. Mi pequeño proyecto no hace lo que se supone que debe hacer, tengo una extraña excepción al inicializar la clase XMLBeans. Aquí está mi huella (lo siento por la fealdad):

12-19 12:07:10.790: W/dalvikvm(13385): Exception 
Ljava/lang/RuntimeException; thrown while initializing 
Lorg/apache/xmlbeans/impl/regex/SchemaRegularExpression; 
12-19 12:07:10.790: W/dalvikvm(13385): Exception 
Ljava/lang/ExceptionInInitializerError; thrown while initializing 
Lorg/apache/xmlbeans/impl/schema/BuiltinSchemaTypeSystem; 
12-19 12:07:10.790: D/dalvikvm(13385): Method.invoke() on bad class 
Lorg/apache/xmlbeans/impl/schema/BuiltinSchemaTypeSystem; failed 
12-19 12:07:10.790: W/dalvikvm(13385): Exception 
Ljava/lang/ExceptionInInitializerError; thrown while initializing 
Lorg/apache/xmlbeans/XmlBeans; 
12-19 12:07:10.790: W/System.err(13385): 
java.lang.reflect.InvocationTargetException 
12-19 12:07:10.790: W/System.err(13385): at 
java.lang.reflect.Method.invokeNative(Native Method) 
12-19 12:07:10.790: W/System.err(13385): at 
java.lang.reflect.Method.invoke(Method.java:491) 
12-19 12:07:10.790: W/System.err(13385): at 
t.fze.TestOfficeAndroidActivity.onCreate(TestOfficeAndroidActivity.java:55) 
12-19 12:07:10.790: W/System.err(13385): at 
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048) 
12-19 12:07:10.790: W/System.err(13385): at 
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1712) 
12-19 12:07:10.790: W/System.err(13385): at 
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1764) 
12-19 12:07:10.790: W/System.err(13385): at 
android.app.ActivityThread.access$1500(ActivityThread.java:122) 
12-19 12:07:10.790: W/System.err(13385): at 
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1002) 
12-19 12:07:10.790: W/System.err(13385): at 
android.os.Handler.dispatchMessage(Handler.java:99) 
12-19 12:07:10.790: W/System.err(13385): at 
android.os.Looper.loop(Looper.java:132) 
12-19 12:07:10.790: W/System.err(13385): at 
android.app.ActivityThread.main(ActivityThread.java:4025) 
12-19 12:07:10.790: W/System.err(13385): at 
java.lang.reflect.Method.invokeNative(Native Method) 
12-19 12:07:10.790: W/System.err(13385): at 
java.lang.reflect.Method.invoke(Method.java:491) 
12-19 12:07:10.790: W/System.err(13385): at 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
12-19 12:07:10.790: W/System.err(13385): at 
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
12-19 12:07:10.790: W/System.err(13385): at 
dalvik.system.NativeStart.main(Native Method) 
12-19 12:07:10.790: W/System.err(13385): Caused by: 
org.apache.poi.POIXMLException: 
java.lang.reflect.InvocationTargetException 
12-19 12:07:10.790: W/System.err(13385): at 
org.apache.poi.xssf.usermodel.XSSFFactory.createDocumentPart(XSSFFactory.java:62) 
12-19 12:07:10.790: W/System.err(13385): at 
org.apache.poi.POIXMLDocumentPart.read(POIXMLDocumentPart.java:414) 
12-19 12:07:10.790: W/System.err(13385): at 
org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:155) 
12-19 12:07:10.790: W/System.err(13385): at 
org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:174) 
12-19 12:07:10.790: W/System.err(13385): at 
org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:63) 
12-19 12:07:10.790: W/System.err(13385): at 
org.apache.poi.ss.examples.html.ToHtml.create(ToHtml.java:139) 
12-19 12:07:10.790: W/System.err(13385): at 
org.apache.poi.ss.examples.html.ToHtml.create(ToHtml.java:123) 
12-19 12:07:10.790: W/System.err(13385): ... 16 more 
12-19 12:07:10.790: W/System.err(13385): Caused by: 
java.lang.reflect.InvocationTargetException 
12-19 12:07:10.790: W/System.err(13385): at 
java.lang.reflect.Constructor.constructNative(Native Method) 
12-19 12:07:10.790: W/System.err(13385): at 
java.lang.reflect.Constructor.newInstance(Constructor.java:416) 
12-19 12:07:10.800: W/System.err(13385): at 
org.apache.poi.xssf.usermodel.XSSFFactory.createDocumentPart(XSSFFactory.java:60) 
12-19 12:07:10.800: W/System.err(13385): ... 22 more 
12-19 12:07:10.800: W/System.err(13385): Caused by: 
java.lang.ExceptionInInitializerError 
12-19 12:07:10.800: W/System.err(13385): at 
org.openxmlformats.schemas.drawingml.x2006.main.ThemeDocument$Factory.parse(ThemeDocument.java:71) 
12-19 12:07:10.800: W/System.err(13385): at 
org.apache.poi.xssf.model.ThemesTable.<init>(ThemesTable.java:38) 
12-19 12:07:10.800: W/System.err(13385): ... 25 more 
12-19 12:07:10.800: W/System.err(13385): Caused by: 
java.lang.ExceptionInInitializerError 
12-19 12:07:10.800: W/System.err(13385): at 
java.lang.reflect.Method.invokeNative(Native Method) 
12-19 12:07:10.800: W/System.err(13385): at 
java.lang.reflect.Method.invoke(Method.java:491) 
12-19 12:07:10.800: W/System.err(13385): at 
org.apache.xmlbeans.XmlBeans.getNoType(XmlBeans.java:856) 
12-19 12:07:10.800: W/System.err(13385): at 
org.apache.xmlbeans.XmlBeans.<clinit>(XmlBeans.java:881) 
12-19 12:07:10.800: W/System.err(13385): ... 27 more 
12-19 12:07:10.800: W/System.err(13385): Caused by: 
java.lang.ExceptionInInitializerError 
12-19 12:07:10.800: W/System.err(13385): at 
org.apache.xmlbeans.impl.schema.BuiltinSchemaTypeSystem.fillInType(BuiltinSchemaTypeSystem.java:1025) 
12-19 12:07:10.800: W/System.err(13385): at 
org.apache.xmlbeans.impl.schema.BuiltinSchemaTypeSystem.<clinit>(BuiltinSchemaTypeSystem.java:223) 
12-19 12:07:10.800: W/System.err(13385): ... 31 more 
12-19 12:07:10.800: W/System.err(13385): Caused by: 
java.lang.RuntimeException: Installation Problem??? Couldn't load 
messages: Can't find resource for bundle 
'org.apache.xmlbeans.impl.regex.message_fr_FR', key '' 
12-19 12:07:10.800: W/System.err(13385): at 
org.apache.xmlbeans.impl.regex.RegexParser.setLocale(RegexParser.java:88) 
12-19 12:07:10.800: W/System.err(13385): at 
org.apache.xmlbeans.impl.regex.RegexParser.<init>(RegexParser.java:78) 
12-19 12:07:10.800: W/System.err(13385): at 
org.apache.xmlbeans.impl.regex.ParserForXMLSchema.<init>(ParserForXMLSchema.java:28) 
12-19 12:07:10.800: W/System.err(13385): at 
org.apache.xmlbeans.impl.regex.RegularExpression.setPattern(RegularExpression.java:2996) 
12-19 12:07:10.800: W/System.err(13385): at 
org.apache.xmlbeans.impl.regex.RegularExpression.setPattern(RegularExpression.java:3009) 
12-19 12:07:10.800: W/System.err(13385): at 
org.apache.xmlbeans.impl.regex.RegularExpression.<init>(RegularExpression.java:2975) 
12-19 12:07:10.800: W/System.err(13385): at 
org.apache.xmlbeans.impl.regex.SchemaRegularExpression.<init>(SchemaRegularExpression.java:27) 
12-19 12:07:10.800: W/System.err(13385): at 
org.apache.xmlbeans.impl.regex.SchemaRegularExpression.<init>(SchemaRegularExpression.java:23) 
12-19 12:07:10.800: W/System.err(13385): at 
org.apache.xmlbeans.impl.regex.SchemaRegularExpression$1.<init>(SchemaRegularExpression.java:44) 
12-19 12:07:10.800: W/System.err(13385): at 
org.apache.xmlbeans.impl.regex.SchemaRegularExpression.buildKnownPatternMap(SchemaRegularExpression.java:43) 
12-19 12:07:10.800: W/System.err(13385): at 
org.apache.xmlbeans.impl.regex.SchemaRegularExpression.<clinit>(SchemaRegularExpression.java:38) 
12-19 12:07:10.800: W/System.err(13385): ... 33 more 
+2

¿Le interesaría compartir su código para Android hasta el momento? Parece que hay una falta de interés en poder leer documentos de MS Office en Android: no he podido encontrar nada útil que no sea tu publicación. En una nota lateral, hay muchas API de fuente cerrada y he tratado de contactar a las diferentes compañías, pero ninguna de ellas ha respondido a ninguna de mis consultas y estoy tratando desesperadamente de encontrar una solución decente (o de hecho cualquiera) para el manejo documentos en Android; \ Como usted solo necesito la conversión a html para los diferentes formatos, ya que solo estoy interesado en mostrar los documentos. – Darwind

+2

Hola Darwin, sí, puedes echar un vistazo a mi código. En realidad, pude hacer que funcione (yay) con POI. Publiqué una explicación completa en el blog de mi empresa (¡lo siento, está en francés!) parte 1 (el uso de puntos de interés simple en Android): http://blog.oxiane.com/2011/12/30/visualiser-un-fichier-office-doc-xls-ppt-sous-android/ parte 2 (para documentos de Office 2007+) http://blog.oxiane.com/2011/12/30/visualiser-un-fichier-office-doc-xls-ppt%E2%80%A6-sous-android-23/ O puede echar un vistazo a mi código (bastante desordenado, pero funciona!) Https://code.google.com/p/display-msoffice-docs-android-with-apache-poi/ –

+0

En una nota al margen, descubrí (poco después de matarme con este puerto POI) que hay una solución MUCHO más simple para manejar documentos de Office 2007+. Utilicé esta lib: http://openxmldeveloper.org/blog/b/openxmldeveloper/archive/2006/11/21/openxmlandjava.aspx No funciona con documentos de Office "binarios" (palabra 2003 ...) por lo que Todavía es necesario implementar POI para esos archivos, pero es mucho más fácil que portar POI. De hecho, me tomó solo unos pocos ajustes para que funcione. No obstante, aún no he compartido mi código. –

3

Usted podría también utilizar ProGuard shrinking. Puede disminuir el tamaño de apk hasta varias veces.

+0

gracias por la idea, pero desafortunadamente no era del tamaño de la APK que intentaba reducir, sino del número de métodos en la aplicación.v Si leía todos los comentarios anteriores, mi problema principal era que había más de 64k métodos en el archivo jar que quería importar. Y 64k métodos son demasiados, ¡no me dejaría compilar el APK! –

2

He creado un "puerto" (si se puede decir así) de XSSF recientemente: https://stackoverflow.com/a/25564538/2155217

Es suficiente para leer y escribir archivos XLSX. Puede no funcionar correctamente si el archivo contiene algunas características adicionales, como Dibujos o Gráficos.

+0

¡Hola Andrew! trabajo increíble que hiciste allí. Aún no lo he probado, pero parece que utiliza el método "ejecutar> ver qué falló> agregar ese archivo al contenedor". Esa también fue mi primera forma de hacerlo, hasta que me di cuenta de que la mayoría del frasco era realmente necesario. ¿Ha podido identificar con mayor precisión qué características faltan? –