无法导出包含0字节图片报表解决办法

问题背景
当报表中包含0字节的图片时,导出Excel时会出现“:0”的提示(见下图),并且无法导出文件;而导出的word是空白文件。

解决办法
我们需要想办法过滤掉大小为0的图片,本文将介绍使用自定义函数解决该问题。

首先我们看一下报表设计:

接下来我们看一下自定义函数的实现过程:

public class GetPic extends Function {

public Object calculate(Context ctx, boolean isInput) {

//判断参数个数

if ( this.paramList.size() < 1 ) {

MessageManager mm = EngineMessage.get();

throw new ReportError("getPic:" + mm.getMessage("function.missingParam"));

}

//取得第一个参数,默认为表达式,需要把该表达式算出来,结果才是函数的参数值

Expression param1=(Expression)this.paramList.get( 0 );

if (param1 == null) { //判断参数是否为空

MessageManager mm = EngineMessage.get();

throw new ReportError("getPic:" + mm.getMessage("function.invalidParam"));

}

//算出第一个参数值

Object result1 = Variant2.getValue(param1.calculate(ctx, isInput), false, isInput);

//判断第一个参数值是否为空

if (result1 == null) {

return null;

}

System.out.println("param1:"+result1.toString());

//判断第一个参数值的数据类型

if (! (result1 instanceof String)) {

MessageManager mm = EngineMessage.get();

throw new ReportError("encrypt:" + mm.getMessage("function.paramTypeError"));

}

//最终返回结果

String finalResult = "";

//根据传递过来的参数进行自己的操作

String filePath="D:\\Program Files\\reportHome\\webapps\\demo\\photo";

File file = new File(filePath);

double size = 0;//文件大小

if(file.isDirectory()){

String[] fileList = file.list();

for(int i=0;i

//在目下查找是否有要显示的图片

if(result1.equals(fileList[i])){//如果有该图片则返回该图片

finalResult = fileList[i].toString();

}

}

}

//如果没有该图片则返回一个指定图片

if(finalResult.equals("")){

finalResult = "none.jpg";

}else{//判断该图片大小是否为0

try {

FileInputStream fis = null;

fis = new FileInputStream(filePath+"/"+finalResult);

size= fis.available();

if(size<=0){

finalResult = "none.jpg";

}

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

finalResult="photo/"+finalResult;

System.out.println("finalResult:"+finalResult);

return finalResult;

}

}

然后在demo\WEB-INF\classes\config下的customFunctions.properties文件中注册该函数:

//0代表普通函数,1代表数据集函数

getPic=0,runqian.GetPic

接着我们再看一下photo目录下的图片详情:

其中3.jpg是大小为0的图片。

最后,我们来看一下发布的效果:

热门文章