我使用相同的数据源生成多个报告。其中一个报告需要在底部打印一些空行(“保留”),以便用户可以手动手动编写缺失数据。
E.g:
+---------+-------------+
| item 1 | bla bla |
+---------+-------------+
| item 2 | foo |
+---------+-------------+
| | | <--- here user can just add forgotten
+---------+-------------+ items with a pen
| | |
+---------+-------------+
JRXML最简单的方法是在数据源末尾有几条null
的记录。然后它只会根据需要打印其“细节”乐队几次没有文字。但是,数据源会重复用于其他报告,而这些报告当然不希望这样。
我可以在报告填充之前以某种方式将这些空行注入JRXML本身的数据源吗?
答案 0 :(得分:1)
您可以修改CustomDataSource并从jrxml设置它以在需要时生成额外的记录:
示例
public class JRExtraEmptyRecordsDataSource extends JRBeanCollectionDataSource {
private int nrOfEmptyRecords=0;
private int currentExtraRecord = 0;
public JRExtraEmptyRecordsDataSource(Collection<?> beanCollection) {
super(beanCollection);
}
@Override
public Object getFieldValue(JRField field) throws JRException {
if (currentExtraRecord==0){
return super.getFieldValue(field);
}
Class<?> theCorrectClass = field.getValueClass();
//Implement your logic to return correct class (reflection or switch) if you need speciall values
//or just return null
return null;
}
@Override
public boolean next() {
boolean next = super.next();
if (next){
return true;
}
currentExtraRecord++;
return currentExtraRecord<=nrOfEmptyRecords;
}
@Override
public void moveFirst() {
super.moveFirst();
currentExtraRecord=0;
}
public int getNrOfEmptyRecords() {
return nrOfEmptyRecords;
}
public int setNrOfEmptyRecords(int nrOfEmptyRecords) {
this.nrOfEmptyRecords = nrOfEmptyRecords;
return this.nrOfEmptyRecords;//Lets return something for variable
}
}
当您需要额外空记录时,在jrxml中添加此变量定义
<variable name="extraRecords" class="java.lang.Integer">
<initialValueExpression><![CDATA[((my.package.JRExtraEmptyRecordsDataSource)$P{REPORT_DATA_SOURCE}).setNrOfEmptyRecords(2)]]></initialValueExpression>
</variable>
通常没有自定义数据源,您可以使用带有columnFooter
属性的isFloatColumnFooter="true"
(或虚拟组页脚带)在详细信息的末尾显示额外信息带。可能我会选择这种方法,因为它有助于自定义额外的行并避免在正常的null
频段中检查detail
如果需要动态指示空记录的数量,请包含一个空记录的子报表并作为数据源传递JREmptyDataSource
new net.sf.jasperreports.engine.JREmptyDataSource(P{nrOfEmptyRecords})