JasperReport

jasperReportsiReport

的使用说明

作者

陈大伟

作成日

2008.9.10(教师节)

版本

0.0.1

备注

jasperReports版本3.0.1 
iReport版本3.0.0

相关网址

JasperReport下载地址:http://jasperreports.sourceforge.net

IReport下载地址:http://ireport.sourceforge.net  

iText亚洲语言包下载地址:http://www.lowagie.com/iText

JasperReports API 帮助:http://jasperreports.sourceforge.net/api/

1. readme

为什么需要JasperReports?   

    JasperReports是一个强大、灵活的报表生成工具,能够展示丰富的页面内容,并将之转换成PDFHTMLXMLExcel(通过POIJExcelAPI实现)和Rtf(通过POI实现)格式。该库完全由Java写成,可以用于在各种Java应用程序,包括J2EEWeb应用程序中生成动态内容。它的主要目的是辅助生成面向页面的(page oriented),准备付诸打印的文档。JasperReport借由定义于XML文档中的report design进行数据组织。这些数据可能来自不同的数据源,包括关系型数据库,collectionsjava对象数组。通过实现简单的接口,用户就可以将report library插入到订制好的数据源中。

为什么需要iReport?

JasperReport借由定义于XML文档中的report design进行数据组织但是繁琐的XML标记和功能API在提供强大的动态及可扩展开发的同时也带来了超高的复杂性,所以我们需要一个图形化可视的IDE来编辑符合jasperReports APIXML文件。而iReport正是这样一款工具。我们用iReport可以进行可视化的报表设计。然而任何事物都不是十全十美的,iReport这一款工具带给我们方便、快捷、直观的同时,也损失了报表设计的灵活性。但就其实用性而言,所损失的灵活性也就微乎其微了。

2. iReport上手

(1) 语言设置,安装好iReport以后,默认语言是繁体中文

(2) 下面是一个较快上手的小例子,如有基础,可以跳过,无须浪费时间

(3) iReport各部分简单说明

     ·Title:每个报表一般会有一个名字,比如×××销售报表,title就是搁置这个名称的最好地方了,当然你也可以根据需要搁置在合适的地方。

     ·pageHeader:报表的一些公共要素,比如页码、创建时间、创建人等信息放置在这里是比较好的选择。

     ·columnHeader:无可非议的这里是放置列的名称,记住不是列数据。

     ·Detial:放置需要循环的数据,比如销售记录数据。

     ·columnFooter:放置列级别的统计计算值或是列的说明。

     ·pageFooter:放置页级别的统计值或是页的说明。

     ·Summary:可能需要对几页(你的报表可能有几个页组成)的统计值。比如50个销售记录共占用了3页,那么放置这些统计记录的统计值最好的地方就是summary

     ·groupHeader:每个表的内容可能需要根据某个属性进行划分显示内容和计算内容,比如希望以月份为单位每组分开显示销售记录,那么就可以定义一个组(组的定义参考后文),groupHeader就是放置组说明或是组标志最好的地方。 

     ·Groupfooter:放置组的统计或是说明

3. iReport数据库连接设置

数据连接设置

测试连接没有问题以后,保存并退出连接设置.

4. iReport连接数据库报表查询

(1) 新建报表

(2) 输入sql,检出字段.

(3) 拖拽需要迭代显示的字段到detail区域

(4) 为了使报表更美观,将报表做简单修饰

(5) 其他区哉如法炮制,最后留下detail区域,通过鼠标拖曳标记为红线的边框线,以适应文本区域的高度

(6) 对齐按钮使用

(7) 添加列名及标题

(8) 预览

(9) 选择预览格式(html,xls,pdf)

iReport默认使用JR Viewer展示预览效果,我们还可以使用html,xls,pdf及其他形式显示预览效果

5. iReport图形报表的绘制

(1) 新建报表,调整各显示区域的高度

(2) 添加图形控件

(3) 添加SQL

(4) 为柱形图表捆绑数据

选好数值以后,点击[OK]

选好各值以后,界面如下

(5)调整图表到适当大小

(6)执行结果

6. JasperReports API导出HTML报表

(1) 绘制模板,并且编译成.jasper文件

(2) 将编译好的.jasper文件考备到WEB工程下

(3) 界面上通过一个超级链接,跳转到后台

<a href="testReport1.do" target="_blank">test report 1</a>

(4) STRUTS 2的配置文件

<action name="subreportTransDatasource" class="jasperJkcyl" method="testReport1">

</action>

(5) 后台方法

由于匆忙,代码未加格式化,为了清晰可考备到文本中查看

public void testReport1(){

  

  // 加载.jasper文件

  File jasperRile = new File(ServletActionContext.getServletContext().getRealPath("/jasper/TestReport1.jasper"));

  

  try{

   // 构造JasperReport 文件

   JasperReport jasperReport = (JasperReport)JRLoader.loadObject(jasperRile.getPath());

   

   // 用数据填充JasperReport文件

   JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, getSimpleDao().getHibernateSession().connection());

   

   // 声明HTML类型的导出类

   JRHtmlExporter exporter = new JRHtmlExporter();

   // 设置导出JASPER_PRINT

   exporter.setParameter(JRHtmlExporterParameter.JASPER_PRINT, jasperPrint);

   // 设置导出流

   exporter.setParameter(JRHtmlExporterParameter.OUTPUT_WRITER, response.getWriter());

   // 设置IS_USING_IMAGES_TO_ALIGNfalse,不显示图片

   exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, Boolean.FALSE);

   // 导出编码

   exporter.setParameter(JRHtmlExporterParameter.CHARACTER_ENCODING, "gb2312");

   // 页面编码

   response.setCharacterEncoding("gb2312");

   // 导出

   exporter.exportReport();

  }catch(Exception e){

   e.printStackTrace();

  }

 }

(6)预览结果

7. JasperReports API导出EXCEL报表

(1) 绘制模板,并且编译成.jasper文件

(2) 将编译好的.jasper文件考备到WEB工程下

(3) 界面上通过一个超级链接,跳转到后台

<a href="testReport1.do" target="_blank">test report 1</a>

(4) STRUTS 2的配置文件

<action name="subreportTransDatasource" class="jasperJkcyl" method="testReport1">

</action>

(5) 后台方法

由于匆忙,代码未加格式化,为了清晰可考备到文本中查看

public void testReport1(){

  

  // 加载.jasper文件

  File jasperRile = new File(ServletActionContext.getServletContext().getRealPath("/jasper/TestReport1.jasper"));

  

  try{

   // 构造JasperReport 文件

   JasperReport jasperReport = (JasperReport)JRLoader.loadObject(jasperRile.getPath());

   

   // 用数据填充JasperReport文件

   JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, getSimpleDao().getHibernateSession().connection());

   // 声明导出对像

   JRXlsExporter exporter = new JRXlsExporter();

   // 设置导出哪个模板

   exporter.setParameter(JRXlsExporterParameter.JASPER_PRINT, jasperPrint);

   // 设置导出流

   exporter.setParameter(JRXlsExporterParameter.OUTPUT_STREAM, response.getOutputStream());

            // 设置Xls的属性   

            exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE);   

            exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE);  

   // 告诉浏览器是导出操EXCEL文件操作

   response.setHeader("Content-Disposition", "attachment; filename=cyjgcyb.xls");

   response.setContentType("application/vnd.ms-excel");

   

   exporter.exportReport();

  }catch(Exception e){

   e.printStackTrace();

  }

 }

(6) 执行结果

打开EXCEL,查看导出结果

8. JasperReports API导出PDF报表

(1) 绘制模板,并且编译成.jasper文件

(2) 将编译好的.jasper文件考备到WEB工程下

(3) 界面上通过一个超级链接,跳转到后台

<a href="testReport1.do" target="_blank">test report 1</a>

(4) STRUTS 2的配置文件

<action name="subreportTransDatasource" class="jasperJkcyl" method="testReport1">

</action>

(5) 后台方法

由于匆忙,代码未加格式化,为了清晰可考备到文本中查看

public void testReport1(){

  

  // 加载.jasper文件

  File jasperRile = new File(ServletActionContext.getServletContext().getRealPath("/jasper/TestReport1.jasper"));

  

  try{

   // 构造JasperReport 文件

   JasperReport jasperReport = (JasperReport)JRLoader.loadObject(jasperRile.getPath());

   

   // 用数据填充JasperReport文件

   JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, getSimpleDao().getHibernateSession().connection());

   // pdf导出设置

            response.setContentType("application/pdf"); 

            response.setCharacterEncoding("UTF-8"); 

 

            // 使用JRPdfExproter导出器导出pdf   

            JRPdfExporter exporter = new JRPdfExporter();   

            // 设置JasperPrintList   

            exporter.setParameter(JRPdfExporterParameter.JASPER_PRINT, jasperPrint);   

            // 设置导出流

            exporter.setParameter(JRPdfExporterParameter.OUTPUT_STREAM, response.getOutputStream());

            // 开始导出

            exporter.exportReport();

   

  }catch(Exception e){

   e.printStackTrace();

  }

 }

(6) 执行结果

9.JasperReports API导出子报表

(1) 为了直观一些,我们先来看子报表导出的结果

(2)报表绘制

这里面需要画三张报表,其中两个子报表,一个父报表.详细如下:

A. 绘制子报表subReport_3_right.jrxml

① 先画出报表的静态部分

② 添加Fields,Parameters

③ 添加参数

B. 绘制子报表subReport_3_left.jrxml

详细操作参照A,界面如下

C. 绘制主报表subReport_3_main.jrxml

这个就是父报表了,我们通过这个父报表来调用AB当中制做的两张子报表.

① 先画出静态部分,如下图

② 添加子报表

③ 之后一路点击[next],直到[finish],并且使用同样的方法将subReport_3_Right.jrxml添加到父报表中

④ 添加参数

⑤ 为子报表配置数据源

⑥ 左边子表的数据源设置好以后,再设置右边子表的数据源

(3) 将三张报表编译好的jasper文件放到工程内

(4) 界面链接

<a href="subreportTransDatasource.do" target="_blank">subreport trans Datasource</a>

(5) STRUTS2 配置文件

   <action name="subreportTransDatasource" class="jasperJkcyl" method="subreportTransDatasource"></action>

(6) 后台处理方法

public void subreportTransDatasource(){

  

  // 声明指向父报表subReport_3_main绝对路径的字符串

  String jasperFile = ServletActionContext.getServletContext().getRealPath("/jasper/subReport_3_main.jasper");

  // 声明指向报表根目录的字符串,主报表需要通过这个路径找到子报表

  String jasperRoot = ServletActionContext.getServletContext().getRealPath("/jasper")+"//";

  

  // 声明向父报表传递参数的map

  Map<String,Object> parameterMap = new HashMap<String,Object>();

  try{

   

   // 构造JasperReport 文件

   JasperReport jasperReport = (JasperReport)JRLoader.loadObject(jasperFile);

   

   // left subreport

   // 检索子报表subReport_3_left.jasper的数据源

   String strSql = "select ny,count(jkcyl) AS jkcyl from kfsj where ny LIKE '2007%' GROUP BY ny";

   List listIncludeObjects = getSimpleDao().findBySQL(strSql); 

   List listIncludeBeans = reconstructList_chartTest(listIncludeObjects);

   JRBeanCollectionDataSource datasource = new JRBeanCollectionDataSource(listIncludeBeans);

   // 设置子报表所在的路径

   parameterMap.put("SUBREPORT_DIR", jasperRoot);

   // 设置DatasourceForLeftSubreport参数,这个参数将作为子报表的数据源被传递

   parameterMap.put("DatasourceForLeftSubreport", datasource);

   

   // right subreport

            // 检索子报表subReport_3_right.jasper的数据源

   strSql = "select ny,count(jkcyl) AS jkcyl from kfsj where ny LIKE '2008%' GROUP BY ny";

   listIncludeObjects = getSimpleDao().findBySQL(strSql); 

   listIncludeBeans = reconstructList_chartTest(listIncludeObjects);

   JRBeanCollectionDataSource datasourceForRight = new JRBeanCollectionDataSource(listIncludeBeans);

            // 设置DatasourceForLeftSubreport参数,这个参数将作为子报表的数据源被传递

   parameterMap.put("DatasourceForRightSubreport", datasourceForRight);

   

   

   // 用数据填充JasperReport文件

   JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameterMap);

   // 声明HTML类型的导出类

   JRHtmlExporter exporter = new JRHtmlExporter();

   // 设置导出JASPER_PRINT

   exporter.setParameter(JRHtmlExporterParameter.JASPER_PRINT, jasperPrint);

   // 设置导出流

   exporter.setParameter(JRHtmlExporterParameter.OUTPUT_WRITER, response.getWriter());

   // 设置IS_USING_IMAGES_TO_ALIGNfalse,不显示图片

   exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, Boolean.FALSE);

   // 导出编码

   exporter.setParameter(JRHtmlExporterParameter.CHARACTER_ENCODING, "UTF-8");

   // 页面编码

   response.setCharacterEncoding("UTF-8");

   // 导出

   exporter.exportReport();

   

  }catch(Exception e){

   e.printStackTrace();

  }

 }

(7) 执行效果

10.JasperReports API 导出子报表补充

以下内容来源于网络,个人认为这个比较容易理解.

  在项目中要做一个报表,利用的是jasperreport,因为子报表要生成好多,业务也比较的复杂,一个比较简单的数据源没有办法满足,而javaBean数据源正好适合,它操作方便,而且我们可以把复杂的业务在系统的业务逻辑层进行运算,组织成javaBean的collection,用此collection为数据源来生成报表。

  具体报表生成过程:

  主报表为main.jrxml,子报表为sub1.jrxml,在主报表中只有一个参数Title和一个子报表,双击主报表中的子报表图标查看子报表的属性,如图1所示,在Subreport选项卡中选择数据源类型为Use data source expression,并填写参数表达式$P{SubDatasource},参数SubDatasource为主报表中的参数,其具体添加情况如图2所示,其中选择类型的时候是可以自己手动填写的;在Subreport(other)中添加子报表中的参数,如图3所示,此图表示了参数由主报表到子报表的传递过程,左边的参数名为子报表中的参数,右边的参数是从主报表中传入的参数。

图1

图2

图3

下面再来看看子报表:

如图4,是整个子报表的情况,子报表中的参数有两个,一个是SubTitle,一个是javaBean的数据源datasource,三个Filed,其中datasource的添加方法与图2相同,三个Filed要与所传入的javaBean中的字段的名字相同。

图4

11. iReport常见问题

(1) 分页设置

(2) 报表横向/纵向设置

(3) PDF不能显示汉字

(4)应用模板内置SQL文从DB中检索出的中文乱码

在显示的文本框中将检索出的字符串转一下字符集即可:

new String($F{JH}.getBytes("ISO8859_1"),"GBK")

(5)无法导出PDF

程序运行正常,且其他格式(html,xls)可以正常导出.唯独导出PDF时,浏览器显示一片空白.

解决办法:如果符合以上条件,则说明程序没有问题,可能与浏览器的设置有关.具体是哪个设置,没有时间去查.索性将浏览器还原成默认设置.以下以IE7为例:打开浏览器->工具->Internet选项->高级->点击"重置"按钮.重启IE使更改生效.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值