android使用POI读取xlxs

使用 Apache POI 读取 excel 的xlxs后缀文件时出现 SAXNotRecognizedException


 java.lang.RuntimeException: http://xml.org/sax/properties/declaration-handler
        at org.apache.xmlbeans.impl.store.Locale$SaxLoader.<init>(Locale.java:3397)
        at org.apache.xmlbeans.impl.store.Locale$XmlReaderSaxLoader.<init>(Locale.java:3087)
        at org.apache.xmlbeans.impl.store.Locale.getSaxLoader(Locale.java:3072)
        at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1272)
        at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1259)
        at org.apache.xmlbeans.impl.schema.SchemaTypeLoaderBase.parse(SchemaTypeLoaderBase.java:345)
...
 Caused by: org.xml.sax.SAXNotRecognizedException: http://xml.org/sax/properties/declaration-handler
        at org.apache.harmony.xml.ExpatReader.setProperty(ExpatReader.java:168)
        at org.apache.xmlbeans.impl.store.Locale$SaxLoader.<init>(Locale.java:3391)

设置下XML 解析器选项试试

System.setProperty("javax.xml.parsers.SAXParserFactory", "com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl");

【以下回答由 GPT 生成】

这个问题是因为Android系统自带的XML解析器无法识别http://xml.org/sax/properties/declaration-handler属性,而Apache POI库依赖该属性进行解析操作。

为了解决这个问题,我们可以使用一个兼容性更好的XML解析器,比如XMLBeans。下面是解决该问题的步骤:

  1. 首先,确保你已经在你的Android项目中引入了XMLBeans库。可以在项目的build.gradle文件中添加以下依赖项:
implementation 'org.apache.xmlbeans:xmlbeans:3.1.0'
  1. 确保你的代码中已经导入了org.apache.xmlbeans包。可以在Java代码文件的开头添加以下导入语句:
import org.apache.xmlbeans.XmlOptions;
  1. 在读取Excel文件之前,先创建一个XmlOptions对象,并将http://xml.org/sax/properties/declaration-handler属性设置为null。这样可以禁用该属性,从而避免出现异常。下面是示例代码:
// 创建XmlOptions对象
XmlOptions options = new XmlOptions();
// 将http://xml.org/sax/properties/declaration-handler属性设置为null
options.setProperty("http://xml.org/sax/properties/declaration-handler", null);
  1. 在使用Apache POI库进行Excel文件解析时,将上面创建的XmlOptions对象传递给相关的方法。下面是示例代码:
// 创建Excel工作簿对象
XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
// 传递XmlOptions对象给解析方法
XSSFSheet sheet = workbook.getSheetAt(0, options);

通过上述步骤,我们成功禁用了http://xml.org/sax/properties/declaration-handler属性,从而避免了SAXNotRecognizedException异常的出现。

如果仍然遇到其他问题,可能是由于其他原因导致的。在这种情况下,建议查阅Apache POI官方文档、Stack Overflow或其他相关资源,以寻找更详细的解决方案或寻求帮助。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

在 build.gradle 模块中包含这些依赖项:
implementation group: 'org.apache.poi', name: 'poi-ooxml', version: '3.17'
implementation group: 'org.apache.xmlbeans', name: 'xmlbeans', version: '3.1.0'
implementation 'javax.xml.stream:stax-api:1.0'
implementation 'com.fasterxml:aalto-xml:1.2.2'
不要使用新版本poi的依赖项。