如何处理报表中的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
相关产品推荐
相关产品推荐

