You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android应用使用POI 3.17读取.xlsx文件时类缺失异常求助

解决Android中Apache POI读取.xlsx文件时的NoClassDefFoundError问题

你遇到的java.lang.NoClassDefFoundError: Failed resolution of: Ljavax/xml/stream/XMLEventFactory;核心原因是:Android运行时环境默认不包含Java标准库中的javax.xml.stream相关类,而Apache POI处理xlsx格式的XSSFWorkbook恰好依赖这些类,你当前引入的POI依赖并没有补上这个缺口。下面给你两个可行的解决方案:

方案一:使用适配Android的POI分支(推荐)

官方Apache POI在Android上存在不少兼容性问题,有开发者专门维护了适配Android的分支poi-android,它已经处理了依赖裁剪和兼容性适配,用起来更省心。

  1. 先移除你当前build.gradle中所有本地POI jar的依赖:
    // 删除这些旧的本地依赖
    // implementation files('libs/poi-3.17.jar')
    // implementation files('libs/xmlbeans-2.6.0.jar')
    // implementation files('libs/poi-ooxml-schemas-3.17.jar')
    // implementation files('libs/poi-ooxml-3.17.jar')
    // implementation files('libs/poi-scratchpad-3.17.jar')
    
  2. 添加适配Android的POI依赖:
    implementation 'com.github.centic9:poi-android:3.17.0'
    
  3. 同步Gradle后重新运行项目,这个分支会自动包含所有处理xlsx所需的依赖,不需要手动补充额外jar包。

方案二:手动补充缺失的XML流依赖(不推荐,易踩坑)

如果你坚持使用官方POI库,需要手动添加javax.xml.stream相关的依赖jar包:

  1. 下载stax-api-1.0.1.jarstax-1.2.0.jar,将它们放到项目的libs目录下
  2. 在build.gradle中添加这两个jar的依赖:
    implementation files('libs/stax-api-1.0.1.jar')
    implementation files('libs/stax-1.2.0.jar')
    

不过这个方法后续可能还会遇到其他依赖缺失的问题,比如其他XML相关类找不到,因此更推荐方案一。

额外注意事项

  • 权限检查:Android 6.0及以上版本需要动态申请READ_EXTERNAL_STORAGE权限,否则代码可能无法访问SD卡上的Test目录下的xlsx文件,记得在代码中添加权限申请逻辑。
  • 文件路径验证:可以在代码中增加日志打印,确认inputWorkbook的路径是否正确,避免因为文件不存在导致的隐藏问题。

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

火山引擎 最新活动