我看到很多使用CustomExpression的例子但由于某些原因它对我不起作用。我使用的是Java 7,Dynamic Jasper 5.0.2,Jasper Reports 5.5.0。 在这个简单的表达式中,我只是想返回字符串" foo"。似乎评估永远不会被调用所以所有行显示为空白而不是" foo"。 " foo"示例仅用于测试目的,但我的最终自定义表达式将是:一个作为2个字段的串联,另一个将是使用是/否替换布尔值1/0。
AbstractColumn columnField = ColumnBuilder.getNew()
.setCustomExpression(getMyCustomExpression())
.setTitle(bundle.getString(fld.getFieldNameDesc())).setWidth(Integer.parseInt(JR_DYNAMIC_DEFAULT_COLUMN_WIDTH))
.setPattern(FieldTypeNameConvertor.getPatternByOracleType(fld.getFieldType()))
.setStyle(getStyle(fld.getFieldType()))
.build();
drb.addColumn(columnField);
...
private CustomExpression getMyCustomExpression() {
return new CustomExpression() {
public Object evaluate(Map fields, Map variables, Map parameters) {
final String myString = "foo";
return myString;
}
public String getClassName() {
return String.class.getName();
}
};
}

如果我创建一个列并设置格式,我也会得到空白:
Format textFormatter = new Format(){
public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) {
if (obj == null || Boolean.FALSE.equals(obj))
toAppendTo.append("No");
else
toAppendTo.append("Yes");
return toAppendTo;
}
public Object parseObject(String source, ParsePosition pos) {
return null;
}
};
....
columnField = ColumnBuilder.getNew()
.setColumnProperty(fld.getFieldNameKey(), getJavaType(fld.getFieldType()))
.setTextFormatter(textFormatter)
.setTitle(bundle.getString(fld.getFieldNameDesc())).setWidth(Integer.parseInt(JR_DYNAMIC_DEFAULT_COLUMN_WIDTH))
.setPattern(FieldTypeNameConvertor.getPatternByOracleType(fld.getFieldType()))
.setStyle(getStyle(fld.getFieldType()))
.build();

答案 0 :(得分:0)
在逐步执行DJ API并修改传递给DynamicJasperHelper.generateJasperReport方法的参数后问题得到解决。 在我的项目中,我尝试使用Jasper API将动态jasper代码集成到现有的报告框架构建中,并覆盖了一些参数。不得不对现有代码如何处理参数,语言环境,资源包与DynamicJasper所期望的内容进行一些更改(最后在调用generateJasperReport之前将资源和语言环境设置为DynamicReport dr):
dr.setResourceBundle(fooResourceBundleName);
dr.setReportLocale(fooLocale);