Android 使用 poi 或 poi-tl 生成 world 文件

Android 使用 Poi 生成 World 文件

注意,查看了 poi-tl 的 release,它在 1.5.0 开始,升级了 poi 组件到 4.0.0,而 poishadow-all.jar 这个兼容Android的 jar 只支持到了 POI 3.17 ,所以如果导入 poi-tl 1.5.0 以上版本会有兼容问题,导致无法使用。如果确实需要使用 poi-tl ,建议使用 1.4.0 版本,例如我当初接入的时候使用的是 1.4.2


在 Android 平台中,如果直接导入并使用 poi 会直接无法编译

如果要使用原生的 poi,推荐看看这个 issues

作者编译了一个 poishadow-all.jar 库,直接导入这个 jar 就可以使用了
这是 作者仓库

但是我想使用 poi-tl ,因为它可以直接使用模板填充,完全满足我目前的工作需求。

Android 使用 poi-tl 填充生成 world 文件

poi-tl 官网

使用 poi-tl 填充 world 入门

如果直接按照官网的操作,使用 gradle 导入

compile group: 'com.deepoove', name: 'poi-tl', version: '1.4.2'

这样是无法编译的。解决方法

采用这样的方式导入,在 build.gradle

implementation('com.deepoove:poi-tl:1.4.2') {
        //在Android 中 poi-tl 所依赖的库会导致无法编译
        //所以只使用 poi-tl 的填充功能
        //然后使用其他作者提供的 poi
        //下面是过滤掉 poi-tl 的依赖库
        exclude group: 'org.apache.xmlbeans', module: 'xmlbeans'
        exclude group: 'org.apache.poi', module: 'poi-ooxml'
        exclude group: 'org.apache.poi', module: 'poi-ooxml-schemas'
        exclude group: 'org.apache.poi', module: 'poi'
    }

主要是下面的 exclude ,把poi-tl 的依赖全部取消掉,然后到这个仓库下载可用的 jar

也可以 点击直接下载 jar 包

放入这个 jar 包到app工程的 libs 中,然后在 build.gradle 文件中

    implementation files('libs/poishadow-all.jar')

至此已经添加好了依赖库,还有最后一步操作,执行下面的操作

(你可以在 onCreate 前,或者初始化的时候执行它,但必须保证是在使用 poi 前)

System.setProperty("org.apache.poi.javax.xml.stream.XMLInputFactory", "com.fasterxml.aalto.stax.InputFactoryImpl");
System.setProperty("org.apache.poi.javax.xml.stream.XMLOutputFactory", "com.fasterxml.aalto.stax.OutputFactoryImpl");
System.setProperty("org.apache.poi.javax.xml.stream.XMLEventFactory", "com.fasterxml.aalto.stax.EventFactoryImpl");

就可以了

其它使用方式就和 poi-tl 没有任何差别了

    /**
     * @param path 需要保存的world的路径
     */
    fun generaWorld(path: String, map: HashMap<String, Any>?, mActivity: Context?) {
        LogUtil.v(TAG, "save world to file,map:" + LogUtil.objToString(map))

        System.setProperty("org.apache.poi.javax.xml.stream.XMLInputFactory", "com.fasterxml.aalto.stax.InputFactoryImpl");
        System.setProperty("org.apache.poi.javax.xml.stream.XMLOutputFactory", "com.fasterxml.aalto.stax.OutputFactoryImpl");
        System.setProperty("org.apache.poi.javax.xml.stream.XMLEventFactory", "com.fasterxml.aalto.stax.EventFactoryImpl");

        val inputStream = mActivity?.assets?.open("model.docx")
        if (inputStream == null) {
            LogUtil.e("can not read template file,please check assets:model.docx")
            Toast.show(mActivity?.getString(R.string.save_faild_cannot_read_file))
            return
        }

        val template = XWPFTemplate.compile(inputStream)
        map?.let {
            template.render(map)
        }
        var outputStream: FileOutputStream? = null

        try {
            outputStream = FileUtil.instant.getFileOutputStream(path)
            if (outputStream == null) {
                LogUtil.w(TAG, "world path:$path is null,check permiss")
                Toast.show(mActivity.getString(R.string.save_faild_cannot_writ))
                return
            }
            template.write(outputStream)
            outputStream.flush()
            Toast.show("save success,path:$path")
        } catch (e: IOException) {
            LogUtil.e(TAG, "world write to output stream io exception:" +
                    LogUtil.objToString(e))
            Toast.show(mActivity.getString(R.string.save_faild_cannot_writ))
        } finally {
            try {
                template.close()
                outputStream?.close()
            } finally {
                LogUtil.i(TAG, "write world to $path output stream over")
            }
        }
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容