You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Apache POI读取英政府Excel文件时的URISyntaxException日志问题

读取英国政府XLSX文件时的POI错误日志问题

读取英国政府提供的外部Excel(.xlsx)文件时,程序未抛出异常但输出了ERROR级别日志。推测是源文件存在格式问题,某段内容被误判为URI导致Java的URI解析失败。目前虽然能正常用POI读取文件内容,但除了调整日志级别抑制错误外,有没有其他方法避免这条日志产生?

错误日志详情

09:13:35.150 [nREPL-session-b3e5d112-80a2-45f3-9e26-095934eeb06a] ERROR org.apache.poi.openxml4j.opc.PackageRelationshipCollection - Cannot convert All%20of%20the%20data%20files%20and%20supporting%20documents%20for%20the%20English%20Indices%20of%20Deprivation%202019%20are%20available%20from:%20www.gov.uk/government/statistics/english-indices-of-deprivation-2019 in a valid relationship URI-> dummy-URI used
java.net.URISyntaxException: Illegal character in scheme name at index 3: All%20of%20the%20data%20files%20and%20supporting%20documents%20for%20the%20English%20Indices%20of%20Deprivation%202019%20are%20available%20from:%20www.gov.uk/government/statistics/english-indices-of-deprivation-2019
    at java.base/java.net.URI$Parser.fail(URI.java:2976) ~[?:?]
    at java.base/java.net.URI$Parser.checkChars(URI.java:3147) ~[?:?]
    at java.base/java.net.URI$Parser.parse(URI.java:3173) ~[?:?]
    at java.base/java.net.URI.<init>(URI.java:623) ~[?:?]
    at org.apache.poi.openxml4j.opc.PackagingURIHelper.toURI(PackagingURIHelper.java:723) ~[poi-ooxml-5.2.3.jar:5.2.3]
    at org.apache.poi.openxml4j.opc.PackageRelationshipCollection.parseRelationshipsPart(PackageRelationshipCollection.java:358) ~[poi-ooxml-5.2.3.jar:5.2.3]
    at org.apache.poi.openxml4j.opc.PackageRelationshipCollection.<init>(PackageRelationshipCollection.java:160) ~[poi-ooxml-5.2.3.jar:5.2.3]
    at org.apache.poi.openxml4j.opc.PackageRelationshipCollection.<init>(PackageRelationshipCollection.java:130) ~[poi-ooxml-5.2.3.jar:5.2.3]
    at org.apache.poi.openxml4j.opc.PackagePart.loadRelationships(PackagePart.java:565) ~[poi-ooxml-5.2.3.jar:5.2.3]
    at org.apache.poi.openxml4j.opc.OPCPackage.getParts(OPCPackage.java:751) ~[poi-ooxml-5.2.3.jar:5.2.3]
    at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:322) ~[poi-ooxml-5.2.3.jar:5.2.3]
    at org.apache.poi.xssf.usermodel.XSSFWorkbookFactory.create(XSSFWorkbookFactory.java:97) ~[poi-ooxml-5.2.3.jar:5.2.3]
    at org.apache.poi.xssf.usermodel.XSSFWorkbookFactory.create(XSSFWorkbookFactory.java:36) ~[poi-ooxml-5.2.3.jar:5.2.3]
    at org.apache.poi.ss.usermodel.WorkbookFactory.lambda$create$2(WorkbookFactory.java:224) ~[poi-5.2.3.jar:5.2.3]
    at org.apache.poi.ss.usermodel.WorkbookFactory.wp(WorkbookFactory.java:329) [poi-5.2.3.jar:5.2.3]
    at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:224) [poi-5.2.3.jar:5.2.3]
    at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:185) [poi-5.2.3.jar:5.2.3]

当前使用的激进日志抑制配置

直接关闭了PackageRelationshipCollection类的所有日志,会错过该类其他重要错误:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="error">
            <AppenderRef ref="Console"/>
        </Root>
        <!-- Turn off ERROR logging from the internals of POI when a URI cannot be parsed -->
        <Logger name="org.apache.poi.openxml4j.opc.PackageRelationshipCollection" level="off">
        </Logger>
    </Loggers>
</Configuration>

替代解决方案

1. 修复源文件(根源解决)

XLSX本质是ZIP压缩包,可按以下步骤修复:

  • 将文件后缀改为.zip并解压
  • 查看_rels目录下的关系XML文件(通常是.rels结尾)
  • 找到包含那段错误文本的关系项,将其Target字段修改为合法URI(比如补全http://前缀,或者直接移除该无效关系项)
  • 重新压缩为ZIP包,改回.xlsx后缀
    如果有权限,也可以直接用Excel打开文件并重新保存,Excel会自动修复内部的无效关系链接。

2. 更精细的日志过滤

不用关闭整个类的日志,而是通过log4j2的RegexFilter只过滤这条特定的错误消息,保留其他正常ERROR日志:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
            <Filters>
                <!-- 只过滤指定的URI解析错误日志 -->
                <RegexFilter regex="Cannot convert All%20of%20the%20data.*dummy-URI used" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="error">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

3. 自定义POI URI解析逻辑(复杂度较高)

如果无法修改源文件或日志配置,可以通过字节码增强工具(如ASM)拦截PackagingURIHelper.toURI方法,在解析前判断字符串是否为合法URI:

  • 对输入的字符串进行预检查,若不符合URI格式则直接返回一个dummy URI,跳过错误日志输出
  • 这种方式需要深入了解POI的内部逻辑,适合必须通过代码层面解决的场景

内容的提问来源于stack exchange,提问作者Mark Wardle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 07:05:12