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
相关产品推荐
相关产品推荐

