如有需要可以自定义 JRDataSource 数据源,比如要在 JTable 控件中显示又想使用 jasperreports 中使用 , 可以让 JTable 的数据源适配 JRDataSource, 只需要实现 JRDataSource 接口即可。
创建 DailySalesDataSource.java, 这是报表的数据源。这个类实现了 jasperreports 中提供的数据源接口 JRDataSource, 实现其中的两个方法 :next() 和 getFieldValue(JRField field) 。
import java.util.List;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRField;
public class DailySalesDataSource implements JRDataSource
{
private List<Object> data ;
private int index = -1;
public DailySalesDataSource(List<Object> data)
{
this . data = data;
}
/**
* 实现了 JRDataSource 中的方法.判断是否还有下一个.
*/
public boolean next() throws JRException
{
index ++;
return ( index < data .size());
}
/**
* 实现了 JRDataSource 中的方法.
* @param field 是对应报表中的要填充的字段的名称.
*/
public Object getFieldValue(JRField field) throws JRException
{
String fieldName = field.getName();
Object obj = data .get( index );
try
{
java.lang.reflect.Field objField = obj.getClass().getDeclaredField(fieldName);
if (objField != null )
{
objField.setAccessible( true );
return objField.get(obj);
}
}
catch (Exception e)
{
e.printStackTrace();
}
return null ;
}
}
创建工厂类,生成 ireport 数据源
import java.util.ArrayList;
import java.util.List;
import net.sf.jasperreports.engine.JRDataSource;
public class DailySalesDataSourceFactory
{
// 为了在 ireport 中能够测试,必须使用 static 方法
public static JRDataSource createDataSource()
{
// 数据源的生成,通常调用 dao 操作
List<Object> data = new ArrayList<Object>();
for ( int i = 0; i < 100; i++)
{
data.add( new DailySales( " 货号 " + i, " 产品 " + i, i, i * 100));
}
return new DailySalesDataSource(data);
}
}
在 ireport 菜单" Data "中选择” Connection/Data sources”, 点击在弹出框中的 new 按钮增加一个 custom JRDataSource 数据源 .
设置活动连接.在菜单" Data "中选择” Set Active Connection”.
Report Query , 在菜单" Data "中选择” Report Query”, 填写 javabean 。
相关步骤见《图示 ireport 中使用 javabean 作数据源开发 基于 jasperreports 报表 过程 》