Android Studio中从Assets读取XLSX文件的Apache POI报错求助
解决Android中用Apache POI读取Assets里XLSX文件的问题
嘿,我一眼就揪出问题所在了——你错误地用了处理旧版Excel(.xls,OLE2格式)的POIFSFileSystem来读取新版的XLSX文件,这就是错误日志里OfficeXmlFileException的元凶!
错误根源
错误日志里的关键提示已经把问题说透了:
The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)
简单来讲,POIFSFileSystem是给旧版.xls文件设计的,而你要读的.xlsx是基于XML的新格式,完全不需要经过这个类处理。
修正方案
直接跳过POIFSFileSystem这一步,把Assets的输入流直接传给WorkbookFactory.create()就行,它会自动识别文件格式,帮你创建对应的Workbook(XSSFWorkbook对应xlsx,HSSFWorkbook对应xls)。
修正后的点击事件代码如下:
// 点击事件函数内代码 InputStream in = null; AssetManager assetManager = getApplicationContext().getAssets(); try { in = assetManager.open("cableSizing.xlsx"); // 直接用输入流创建Workbook,无需POIFSFileSystem Workbook workbook = WorkbookFactory.create(in); // 后续操作示例:获取第一个工作表 Sheet sheet = workbook.getSheetAt(0); // ... 这里写你的数据读取业务逻辑 } catch (IOException | InvalidFormatException e) { e.printStackTrace(); } finally { // 记得关闭输入流,避免资源泄漏 if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } }
额外注意事项
- 依赖检查:确保你在
build.gradle里添加了正确的Apache POI依赖,针对XLSX文件,至少需要poi-ooxml相关依赖(如果担心包体积过大,可以考虑用精简版的poi-ooxml-lite)。 - 文件路径:确认Assets文件夹里的
cableSizing.xlsx路径完全正确,Android对Assets里的文件名大小写敏感,别写错字符。 - 异常处理:务必保留完整的异常捕获和资源关闭逻辑,避免出现内存泄漏或崩溃问题。
内容的提问来源于stack exchange,提问作者chamoun michel
相关产品推荐
相关产品推荐

