You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中使用Docx4j生成Docx文件时应用崩溃求助

解决Android下Docx4j生成Docx时的FactoryConfigurationError崩溃问题

嘿,这个问题我之前帮朋友排查过,本质是Docx4j依赖的StAX解析器在Android环境下缺失或冲突导致的。你看到的javax.xml.stream.FactoryConfigurationError: Provider com.bea.xml.stream.MXParserFactory not found,是因为Docx4j默认依赖的BEA StAX解析器并不是Android系统预装的组件,而且Android自带的StAX实现和它不兼容。

下面是具体的解决步骤,亲测有效:

1. 调整Gradle依赖,替换为Android兼容的StAX库

首先,确保你用的是最新稳定版的Docx4j,同时排除它自带的旧StAX依赖,换成Woodstox(一个Android友好的StAX实现):

// 主Docx4j核心库
implementation 'org.docx4j:docx4j-core:8.3.9'
// Android兼容的StAX API和实现
implementation 'javax.xml.stream:stax-api:1.0-2'
implementation 'org.codehaus.woodstox:woodstox-core-asl:4.4.1'

// 排除Docx4j自带的冲突依赖
configurations.all {
    exclude group: 'com.sun.xml.stream', module: 'sjsxp'
    exclude group: 'com.bea.xml', module: 'jsr173-ri'
}

2. 手动指定StAX工厂类

在应用初始化的时候(比如自定义Application类的onCreate方法,或者生成Docx的代码执行前),设置系统属性强制使用Woodstox的StAX工厂:

static {
    // 指定Woodstox作为StAX实现
    System.setProperty("javax.xml.stream.XMLInputFactory", "com.ctc.wstx.stax.WstxInputFactory");
    System.setProperty("javax.xml.stream.XMLOutputFactory", "com.ctc.wstx.stax.WstxOutputFactory");
    System.setProperty("javax.xml.stream.XMLEventFactory", "com.ctc.wstx.stax.WstxEventFactory");
}

这一步能让Docx4j找到正确的解析器,而不是去搜那个不存在的BEA工厂。

3. 配置混淆规则(如果开启了R8/ProGuard)

如果你的应用开启了代码混淆,一定要把StAX和Docx4j相关的类保留下来,不然混淆后会找不到类。在proguard-rules.pro里添加:

-keep class com.ctc.wstx.** { *; }
-keep class javax.xml.stream.** { *; }
-keep class org.docx4j.** { *; }

额外注意点

  • 确保你已经动态申请了外部存储读写权限(Android 6.0+),虽然这次崩溃不是权限问题,但生成Docx文件时如果没有权限也会报错;
  • 尽量避免在主线程执行Docx生成操作,建议放到AsyncTask或者Coroutine里,不然可能会触发ANR。

内容的提问来源于stack exchange,提问作者kondori_reza1990

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:25:55