jasperreport(3)

2020-02-22 12:56

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.脚本


jasperreport(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:精编新版《安全员》考试题库800题(答案)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: