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

如何处理报表中的Image Not Found Exception异常

解决报表图片不存在时抛出异常的问题

我之前做报表开发时也碰到过一模一样的情况——图片路径不对或者文件不存在就直接抛异常,太影响报表输出体验了。咱们可以通过两种方式处理,让没图的时候要么不渲染这个元素,要么显示空白占位:

方法一:仅当文件存在时才渲染图片元素

你的现有代码已经用了printWhenExpression,但只是判断了signImagePath不为空,没检查最终拼接后的文件是否真的存在。咱们把判断逻辑改成检查文件是否存在,这样文件不存在时就不会尝试加载图片,自然不会抛异常:

首先,在报表的imports部分添加File类的导入:

<imports>
    <import value="java.io.File"/>
</imports>

然后修改printWhenExpression:

<printWhenExpression><![CDATA[
    String fullImagePath = $P{signImagePath} + $F{USER_CODE} + ".jpg";
    new File(fullImagePath).exists()
]]></printWhenExpression>

这样只有当目标图片文件确实存在时,这个图片元素才会被渲染;不存在的话就直接跳过,报表里这个位置会是空的(如果你的isRemoveLineWhenBlank设为true,连占位的行都会自动去掉)。

方法二:保留占位框,显示空白而非异常

如果你需要保留图片元素的占位区域(比如要保持报表布局整齐),不想去掉这个元素,那可以修改imageExpression,当文件不存在时返回null或者一个空白图片的内容:

同样需要先导入File类,然后修改imageExpression:

<imageExpression class="java.lang.Object"><![CDATA[
    String fullImagePath = $P{signImagePath} + $F{USER_CODE} + ".jpg";
    File imageFile = new File(fullImagePath);
    if (imageFile.exists()) {
        return fullImagePath;
    } else {
        // 返回null,报表引擎会跳过图片加载,显示空白
        return null;
        // 要是想显示一张默认空白图,也可以返回空白图的InputStream或者字节数组
        // return new ByteArrayInputStream(new byte[0]);
    }
]]></imageExpression>

记得把reportElement里的isRemoveLineWhenBlank改成false,这样即使没图片,这个占位区域也会保留,显示空白。

两种方法里,我更推荐第一种,因为它更高效——不需要加载不存在的资源,还能保持报表整洁。如果有严格的布局要求,第二种就很合适。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 08:19:05