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

Android Studio Kotlin中用Apache POI读取XLSX文件报错求助

问题分析

直接用DocumentBuilder解析XLSX文件是错误的——XLSX本质是ZIP压缩格式(报错里的PK是ZIP文件的标识),内部包含多个XML文档,并非单一XML文件,XML解析器无法识别这种结构,因此抛出SAXParseException。

解决方案

使用Apache POI的XSSFWorkbook专门处理XLSX文件,步骤如下:

1. 添加Apache POI依赖

在模块级build.gradle.kts(或build.gradle)中引入POI依赖,同时排除与Android系统冲突的XML库:

dependencies {
    // Apache POI 处理XLSX
    implementation("org.apache.poi:poi-ooxml:5.2.5") {
        exclude(group = "xml-apis", module = "xml-apis")
    }
}

2. 修改performImport方法

替换原XML解析逻辑,改用POI读取XLSX内容:

private suspend fun performImport(uri: Uri) {
    withContext(Dispatchers.IO) {
        try {
            contentResolver.openInputStream(uri)?.use { inputStream ->
                // 初始化XLSX工作簿
                val workbook = XSSFWorkbook(inputStream)
                
                // 读取第一个工作表(可根据需求指定表名或索引)
                val sheet = workbook.getSheetAt(0)
                sheet?.let {
                    // 遍历所有行
                    for (row in it) {
                        val rowContent = StringBuilder()
                        // 遍历行内所有单元格
                        for (cell in row) {
                            val cellValue = when (cell.cellType) {
                                CellType.STRING -> cell.stringCellValue
                                CellType.NUMERIC -> {
                                    // 区分日期和普通数字
                                    if (DateUtil.isCellDateFormatted(cell)) {
                                        cell.dateCellValue.toString()
                                    } else {
                                        cell.numericCellValue.toString()
                                    }
                                }
                                CellType.BOOLEAN -> cell.booleanCellValue.toString()
                                else -> ""
                            }
                            rowContent.append("$cellValue\t")
                        }
                        Log.d("ImportActivity", "读取到行数据: ${rowContent.toString().trim()}")
                    }
                }
                
                workbook.close()
            }
        } catch (e: Exception) {
            e.printStackTrace()
            Log.e("ImportActivity", "导入失败: ${e.message}")
        }
    }
}

3. 关键说明

  • XSSFWorkbook是POI专为XLSX设计的解析类,能正确处理ZIP压缩包内的XML结构;
  • 代码适配了不同类型的单元格(字符串、数字、日期、布尔值),可根据你的实际数据结构调整;
  • 保留了原有的协程和IO线程调度,符合Android性能规范;
  • 输入流通过use块自动管理,工作簿手动关闭以释放资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 15:33:17