之前POI 4.x版本踩了不少坑,痛定思痛直接上5.x版本,看看新坑会不会能填掉4.x问题的空缺
一、环境搭建
依赖库引用
dependencies {
implementation 'org.apache.poi:poi:5.2.0'
implementation 'org.apache.poi:poi-ooxml:5.2.0'
// Android底层库是不支持poi框架解析xlsx文件的, 因为XMLStreamReader仅在JAVASE中提供.需要引入javax的组件包解决此问题
implementation 'stax:stax-api:1.0.1'
}
二、代码示例
public List<String> readExcel(InputStream ins) {
List<String> strings = new ArrayList<>();
try {
Workbook workbook = WorkbookFactory.create(ins);
Sheet sheet = workbook.getSheetAt(0);
for (Row row: sheet) {
for (Cell cell: row) {
if (cell.getCellType() == CellType.NUMERIC) {
Log.i(TAG, "readExcel: data = " + cell.getNumericCellValue());
} else if (cell.getCellType() == CellType.STRING) {
Log.i(TAG, "readExcel: data = " + cell.getStringCellValue());
} else if (cell.getCellType() == CellType.BOOLEAN) {
Log.i(TAG, "readExcel: data = " + cell.getBooleanCellValue());
}
}
}
workbook.close();
} catch (IOException e) {
e.printStackTrace();
}
return strings;
}
public void read() {
// 获取AssetsManger对象
AssetManager assetManager = context.getAssets();
InputStream inputStream = null;
try {
inputStream = assetManager.open("data.xlsx");
List<String> strings = excelReader.readExcel(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
通过获取Assets资源文件的输入流,直接去取data.xlsx的数据,然后果不其然又报错了
三、报错过程
意思是没法使用前缀命名这个特性,查下论坛各位老哥有啥破局方法:
1. 降版本方法:CSDN其中一篇说降到3.1.2解决,而我4.x版本都踩这么多坑,降版本实在不太靠谱,换一个
2. 特性问题:CSDN另外一篇说是谷歌写的Android特性问题
原文链接:https://blog.csdn.net/rzleilei/article/details/121402025
java里面,SAXParserFactory的实现类是com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl
而安卓里面SAXParserFactory的实现类被谷歌改掉了,是org.apache.harmony.xml.parsers.SAXParserFactoryImpl
在谷歌魔改的实现类里,本应实现的六个属性,安卓只实现了其中两个
没明白谷歌为啥缺失这几个东西不做,也没有找到解决方案
四、解决方法
回顾了一下问题报错,我意识到这个说法,
The 'namespace-prefix' feature is not supported while the 'namespaces' feature is enabled.
这不是妥妥的API不支持前缀命名的问题嘛?直接进入.xlsx文件,另存为.xls文件
修改代码如下:
public void read() {
// 获取AssetsManger对象
AssetManager assetManager = context.getAssets();
InputStream inputStream = null;
try {
inputStream = assetManager.open("data.xls");
List<String> strings = excelReader.readExcel(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
运行正常,问题解决