使用Apache POI生成Excel时遇IllegalArgumentException异常求助
解决思路
问题根源
该异常是因为Apache POI尝试使用Java 9及以上版本才引入的XML安全属性accessExternalStylesheet,但你的运行环境是Java 8,不支持该属性,从而抛出参数非法异常。
具体解决方案
1. 降级Apache POI版本到Java 8兼容版
POI 5.x及以上版本要求Java 9+运行环境,如果你当前使用的是POI 5.x,直接降级到POI 4.x系列的稳定版本(比如4.1.2),该版本完全兼容Java 8,不会触发这个属性校验问题。
2. 手动跳过不支持的XML安全属性配置
如果不想降级POI版本,可以通过自定义POI的XML工厂配置,跳过Java 8不支持的属性设置:
import org.apache.poi.util.SecureXMLFactory; import javax.xml.stream.XMLInputFactory; public class Java8CompatibleXMLFactory extends SecureXMLFactory { @Override protected void configureXMLInputFactory(XMLInputFactory factory) { try { // 仅配置Java 8支持的XML安全属性 factory.setProperty("javax.xml.accessExternalDTD", ""); factory.setProperty("javax.xml.accessExternalSchema", ""); // 跳过accessExternalStylesheet属性设置,避免触发异常 } catch (IllegalArgumentException e) { // 捕获并忽略不支持属性的异常 } } }
然后在初始化POI工作簿前,设置使用该自定义工厂:
SecureXMLFactory.setInstance(new Java8CompatibleXMLFactory());
3. 排查并修复依赖冲突
检查项目依赖树,确认是否存在不同版本的XML相关依赖(如stax-api、jaxp-api),这些依赖可能导致POI加载了错误版本的XMLConstants类。确保所有XML相关依赖都与Java 8兼容,比如使用jaxp-api:1.4.2或对应Java 8自带的版本。
内容的提问来源于stack exchange,提问作者Prabeethsoy Nair
相关产品推荐
相关产品推荐

