【问题标题】:Trying to port Apache POI to Android尝试将 Apache POI 移植到 Android
【发布时间】:2012-01-19 13:54:54
【问题描述】:

我正在寻找 poi-3.8.jar 的轻量级版本,以便在 Android(私有)应用程序中使用它。 由于某种原因,我似乎无法将整个 1.7Mb jar 放入 APK 中(无论如何这样做都是错误的),因为我只是在寻找 doc -> html 和 xls -> html功能,我不太确定我需要整个 jar 文件。

我花了几个小时试图弄清楚如何在 poi/hwpf/converter 中提取 org.apache.poi.hwpf.converter.WordToHtmlExtracter.java 但看起来它使用了很多其他东西。即使这并不让我感到惊讶,我在想也许这里的某个人会知道我可以摆脱哪些包以使罐子更小。我很乐意花更多时间在这上面,除非这里有人告诉我这是浪费时间,而且源代码中的所有内容都需要将 doc 转换为 html 文件。

我不需要任何显示任何内容的东西,我只需要“简单”的 doc 到 html(如果可能的话,还需要 xls 到 html)特性。我不需要任何与 PDF、powerpoint、outlook 或其他相关的东西。

我很乐意分享我的发现

干杯

【问题讨论】:

    标签: android ms-office apache-poi


    【解决方案1】:

    嗯,我能够完成我在这里要求的大部分工作。那就是导入jar文件。我至少有两种问题: - Eclipse 上没有足够的 RAM,这导致我的类在大多数情况下崩溃(通过调整 Eclipse.ini 中的 Xmx 和 xms 值来修复) - 每个 DEX 文件的 64k 方法限制使事情变得复杂。我不得不将所有需要的 POI jar 拆分成几个 DEX 文件。 (我是按照 Android 博客中的教程做到的:http://android-developers.blogspot.com/2011/07/custom-class-loading-in-dalvik.html

    我的问题的真正答案是:“是的,你需要罐子里的所有东西”。我使它适用于基本的“非开放xml”文件。我的应用程序可以很好地转换为 html,而且速度也足够快。

    顺便说一句,我也试图对“打开 XML”文件做同样的事情,但它要复杂得多。我的小项目没有做它应该做的事情,我在初始化 XMLBeans 类时遇到了一些奇怪的异常。这是我的踪迹(为丑陋见谅):

    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
    

    【讨论】:

    • 到目前为止,您是否有兴趣分享您的 Android 代码?似乎对能够在 Android 上阅读 MS Office 文档缺乏兴趣 - 除了您的帖子之外,我找不到任何有用的东西。附带说明一下,有很多闭源 API,我尝试联系不同的公司,但他们都没有回答我的任何问题,我正在拼命寻找一个体面的(或实际上任何)解决方案来处理Android 上的文档;\ 正如您一样,我只需要将不同格式的转换为 html,因为我只对显示文档感兴趣。
    • 嗨 Darwind,是的,你可以看看我的代码。实际上,我能够使它与 POI 一起工作(耶)。我在我公司的博客上发布了完整的解释(抱歉,是法语!)第 1 部分(Android 上的简单 POI 用法):blog.oxiane.com/2011/12/30/… 第 2 部分(适用于 Office 2007+ 文档)blog.oxiane.com/2011/12/30/… 或者你可以看看我的代码(相当混乱,但它有效!)code.google.com/p/display-msoffice-docs-android-with-apache-poi
    • 在旁注中,我发现(在用这个 POI 端口杀死自己后不久)有一个更简单的解决方案来处理 Office 2007+ 文档。我使用了这个库:openxmldeveloper.org/blog/b/openxmldeveloper/archive/2006/11/21/… 它不适用于“二进制”Office 文档(word 2003...),因此您仍然需要为这些文件实现 POI,但它比移植 POI 容易得多。事实上,我只做了很少的调整就可以让它工作。不过我还没有分享我的代码。
    • 迄今为止令人印象深刻的工作 ;-) 我在您的 repo 中试用了 apk,看起来它正在工作,尽管转换为 html 忽略了电子表格中的颜色。然而,该应用程序会在 SD 卡上转储大约 38 MB 的数据 - dex 文件当然会占用大量空间。由于该应用程序在 SD 卡上占用了如此多的空间,恐怕它对我来说确实不是一个“可接受”的解决方案;\ 我将在本周晚些时候查看 POI 库,看看我是否能以某种方式以某种方式将 docToHtml 和 xlsToHtml 从库中刮出。非常感谢您迄今为止分享您的发现和代码 ;-)
    • 嗨,是的,我知道输出中缺少的颜色以及 SD 卡上令人难以置信的大小。我为挑战做了更多的 POI 端口 :) 我建议你看看其他链接 openxmldeveloper.org/blog/b/openxmldeveloper/archive/2006/11/21/… 它更轻。有机会我会在某处放一些代码。
    【解决方案2】:

    您也可以使用ProGuard shrinking。它可以将 apk 的大小减少数倍。

    【讨论】:

    • 感谢您的想法,但不幸的是这不是我试图减少的 APK 的大小,而是应用程序中的方法数量。v 如果您阅读了上面所有的 cmets,我的主要问题是不是我要导入的 jar 文件中有超过 64k 的方法。而且64k的方法太多了,不让我编译APK!
    【解决方案3】:

    我最近创建了 XSSF 的“端口”(如果我可以这么说的话): https://stackoverflow.com/a/25564538/2155217

    读取和写入 XLSX 文件就足够了。如果文件包含一些额外的功能,例如绘图或图表,可能无法正常工作。

    【讨论】:

    • 你好安德鲁!你在那里做了很棒的工作。我还没有测试它,但看起来你使用的方法是“运行 > 查看失败的内容 > 将该文件添加到 jar 中”。这也是我这样做的第一种方式,直到我意识到实际上需要大部分罐子。您是否能够更准确地确定缺少哪些功能?
    猜你喜欢
    • 2014-01-22
    • 2021-02-09
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多