无法导出包含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的图片。
最后,我们来看一下发布的效果: