import org.apache.commons.beanutils.PropertyUtils;
import net.sf.jasperreports.engine.JRDataSource; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JRField;
publicclass TestBeanDataSource implements JRDataSource {
private List list; privateintindex=-1;
public TestBeanDataSource() { list=new ArrayList(); Bean bean=null;
for(int i=0;i<100;i++) { bean=new Bean(); bean.setID(i);
bean.setNAME(\
bean.setNICKNAME(\
bean.setBALANCE((float)(Math.random()*100*i)); bean.setSCORE(i*2);
bean.setLASTLOGINDATE(new Timestamp(System.currentTimeMillis()));
list.add(bean); } }
publicboolean next() throws JRException { return ++index // return false; } public Object getFieldValue(JRField field) throws JRException { Bean bean=(Bean)list.get(index); String fieldName=field.getName(); try { return PropertyUtils.getProperty(bean,fieldName); } catch (Exception e) { thrownew JRException(e); } } public List getList() { returnlist; } publicvoid setList(List list) { this.list = list; } } 3.在填充报表时将该DataSource传进去就行了。 JasperPrint print=JasperFillManager.fillReport(jasper,map,new TestBeanDataSource()); JRHtmlExporter exporter = new JRHtmlExporter(); … exporter.setParameter(JRExporterParameter.JASPER_PRINT, print); … exporter.exportReport(); 此时报表数据的来源,就是从自定义数据源中得到的100条记录。 如何配制ireport支持自定义的数据源? 1.把以上两个类创建好后,还要创建一个工厂类,用于生产自定义数据源,该工厂类代码如下: package test; import net.sf.jasperreports.engine.JRDataSource; publicclass TestCustomJRDataSourceFactory { publicstatic JRDataSource test() { returnnew TestBeanDataSource(); } } 2.由于是自定义数据源,因此要将数据源引用的相关类,全部引入ireport的classpath,以供ireport调用,否则ireport会抛java.lang.ClassNotFoundException,例如我以上三个类都是放在d:/workspace/jasperreports/classes目录下,那么点 Options -> Classpath -> Add Folder 选择d:/workspace/jasperreports/classes,选择好后,点Save Classpath。 3.在ireport中创建一个自定义数据源 点Data -> Connections/Data Sources -> New -> Custom JRDataSource 将弹出一窗口,根据提示填写内容,例: Name:testCustom Factory Class:test.TestCustomJRDataSourceFactory The static method to call…:test 点击Test,弹出Connection test successful!,则代表自定义数据源配制成功,否则请检查错误。 完成了这三步,就可以在ireport中使用该自定义数据源了。 如何激活数据源? 创建好数据源后,ireport会自动激活它,由于同一时刻只能有一个数据源处于激活状态,所以当你想激活其它数据源时可如下操作: 点Data -> Set Active Connection,在弹出的窗口中选择你要激活的数据源,再点OK就激活了。 只有激活的数据源才会传给报表。 5.国际化(I18N) 国际化,又称I18N,因为国际化的英文是Internationalization,它以I开头,以N结尾,中间共18个字母。 Jasprereports通过ResourceBundle类支持I18N。 在ireport中如何配制支持I18N? 我们新建一个报表,报表名为I18NTest,然后点Edit -> Internationalization -> Locale Files -> Create New Locale,输入_zh_CN,按OK,此时创建了一个支持中文的.properties文件,它的文件名全写是I18NTest_zh_CN.properties,存放在与报表文件在同一目录下,我们再建一个支持英文的.properties文件,单击Create New Locale,输入_en,按OK。如果你对ResourceBundle类有些了解,那么你就会知道输入的是什么意思。 创建属性文件后,下一步就是编辑它们,在Locale resource bundle窗口中,双击I18NTest_zh_CN.properties,此时即可对编辑属性文件,我们在属性文件中增加一条i18n=嗨!国际化,然后保存。再编辑I18NTest_en.properties,在属性文件中增加一条i18n=hello I18n,保存。 以上操作即配制好了ireport支持i18n。 如何调用显示属性文件内容? 在报表的任何一个区域都可以调用属性文件显示内容。 调用语法:$R{key} 或 str(key) 例:如要调用上面所配制的属性,使用 $R{i18n} 或 str(“i18n”) 格式化消息使用msg(pattern, arg1) 例:msg(”my name is {0}.”,”zhannggle”) 则输出:my name is zhanngle. msg()有三个重载方式,msg(pattern,arg1), msg(pattern,arg1,arg1), msg(pattern,arg1,arg1,arg1) 区别就是参数不同而已,底层是通过MessageFormat.format(pattern,arguments)实现的。 使用属性文件格式化消息。 例有一属性文件定义如下: a=jasperreports b=ireport hi=hello {0},hello {1}! 我们可以使用以下表达式显示消息 msg(str(“hi”),str(“a”),str(“b”)) 输出:hello jasperreports,hello ireport! 在web开发中如何存放属性文件? 将属性文件存放到WEB-INF/classes目录下,jasprereports会去这个目录搜索它。 提示:只要配制好ireport支持I18N,就可以到报表文件存放目录找到自动生成好的属性文件,将它们拷到WEB-INF/classes目录下就可以了。 [讨论]:jasperreports是通过ResourceBundle.getBundle()获取属性文件,而getBundle()有三种重载方式getBundle(baseName),getBundle(baseName,locale),getBundle(baseName,locale,loader) 不知jasperreports是采用哪种方式,如果采用第一种,则根据服务器系统默认语言获取属性文件,而不管客户端请求哪种语言,如采用第二、三种,则会根据客户端请求语言去获取属性文件。而我在做测试时,不管将客户端设置成何种语言,都返回服务器系统默认语言,挻郁闷的,不知是我哪里错了,还是jasperreports采用了第一种方式去获取属性文件,没测出来,挻遗憾的,要查看源码才知道。 6.脚本