Jasper+ireport开发报表系统常见问题!

ireport使用数据库连接的jar文件放置在D:\iReport-4.6.0\platform9\lib,而非D:\iReport-4.6.0\ireport\libs

1.安装:iReport的安装从3.0.0开始变得非常简单,你只需下载以后解压,点击bat文件或exe文件

   ,如果报错的话可能是你的JDK版本或是JDK配置问题。

2.需要的jar包:

                      a.为保证编译及生成的报表文件生成结果都是正确的,你需要确保JasperReports和iReport

                          的版本是一致的,例如3.0.0的JasperReports对应3.0.0的iReport

                       b.保证iReport的lib文件夹下面含有itext-1.1.jar和iTextAsian.jar这两个包,他们是用于

                         设置PDF的文件的亚洲字体。

                       c.进行web开发的时候将iReport中的jasperreports-3.0.0.jar文件copy到lib目录下即可。

3.web开发:

                   a.获得JDBC连接:Connection con =(这里可以从springhibernate中获得,直接用JDBC生成也可),

                   b.填充参数:在数据库查询或变量标题中会使用到参数,生成的Jasper文件在生成具体报表文件的时候

                      需要对其中的参数进行赋值:

                      Map props = new HashMap();

                      props.put("name", new String("name")); 

                   c.对JasperReports进行管理:

                    JasperCompileManager(将xml文件编译成jasper文件)

                    JasperFillManager(根据参数和数据源填充jasper文件或JasperReport产生JasperPrint对象)

                    JasperPrintManager(直接输出进行打印)

                    JasperExportManager(将JasperPrint对象导出为PDF或XLS、Html文件)----建议多采用这个进行管理

                    JasperRunManager(相当于先进行JasperFillManager的填充,再进行JasperExportManager的导出)

4.典型案例

  ServletContext servletContext =ServletActionContext.getServletContext();//获得服务器容器对象
  File reportFile = new File(servletContext.getRealPath("Template/"+jaspername));
  Map parameters = new HashMap();
  Java.sql.Connection conn =iniconn();//获得数据库连接
  JasperPrint jasperPrint=JasperFillManager.fillReport(reportFile.getPath(),parameters,conn);
  JRXlsExporter exporter = new JRXlsExporter();//创建实例
  String endfile=jaspername.substring(0, jaspername.length()-7);//导出文件路径和文件名
  exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);//设置参数
  exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME,

                                      servletContext.getRealPath("/Report/Excel")+"/"+endfile+".xls");
  exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE);
  exporter.exportReport();//导出报表
  conn.close();

5.iReport设计报表注意事项:

   1.画线。    如果需要画线,就选中该字段,右击->属性->Border,建议每个字段的左边和下边画上线,最后一字段就

                   左边、下边和右边都画上线,这样就不会看上去两根线重复。
   2.自动变量。如果需要增加一个自动增加的序号,可在预览->报表变量,随便起个名字,变量类型选择

                     java.lang.Integer,Caculation type选择Count,Reset type选择Report,其余的默认,

                     完了以后把该变量拖拉到你喜欢的位置设计下就OK了。
   3.自动换行。如果不处理一下,有些字段的内容太长了就会显示不全。选中该字段,右击->属性,

                     在Text Field把Stretch with overflow勾上。同时把该行所有的字段选上,右击->属性,

                     在Common的Stretch Type选择Relative to tallest object。

   4.快速整理和对齐报表元素:
      4.1.点击随便一个要对齐的元素,左边的文档结构列表里相应的report session会打开
      4.2.用shift键选择该session里的所有元素(快速批量选择所有元素)
      4.3.ctrl+shift+l, ctrl+shift+向上箭头(左对齐和上对齐,都会向第一个选择的元素看齐)
      4.4.同时选择多个元素然后点选属性批量修改。

   5.报表分组:

      5.1.为保证你的报表数据按一定的规律逐个打印出来,你需要对报表进行分组,比较典型的有一对多的关系输出。

      5.2.加入A和B的关系是一对多的,我们希望按照部门来输出人员的信息;

      5.3.select 部门.name 部门.ID 员工.name 员工.message  from 部门,员工 where 员工.部门ID=部门.ID

      5.4.选择分组 编辑->新建报表组向导->填写名字、从结果属性中选择报表对象->next 两下

      5.5.在grouphead中拉进去你希望显示的组头,中间显示循环的组成员部分,groupfoot显示报表底部信息.

      5.6.运行iReport即可得到你想要的结果了。

  6.一般操作:
      6.1.iReport3.0.0可以在设计的时候进行copy和剪切,容易出错,在实际设计报表的时候不建议使用。

      6.2.图表显示数据的选择:序列表达式(多少个),类别表达式(类别名称),数值表达式(用于生成图表,只能是数字)
      6.3.在子报表中使用数据库连接:$P{REPORT_CONNECTION},这个参数记录这一个与这个报表相对的

            java.sql.Connection的对象,一般在子报表中可以直接利用它来建立数据库连接和查询。

iReport报表开发中遇到的问题:

1。 报表中工具栏中
T :不会变得文字
F :程序传过来的文字字段

2。 在网页上预览报表什么内容也不显示
解决方法:
编辑-〉报表属性-〉More...->在“如果没有数据时:后面的下拉菜单中选 All sections,no detail”
如果没有数据时:后面的下拉菜单中的几个选项的意思分别是:
No pages [当Detail中没有数据时没有页显示]
Blank page [当Detail中没有数据时出现一个空白页面]
All sections,no detail [当Detail中没有数据时会显示detail以外的东西]
No-date section [] 暂时我也不知道,呵呵。

3。 Detail 和columnFooter 只间总是有一段空白
解决方法:从 iReprot 工具列设定 [预览] -> [报表属性]
打开[More...] -> [Floating column footer] 打勾columnFooter 就會和 Detail 在一起了。

4。 报表中Detail循环部分内容的显示格式
报表中Detail循环部分内容的显示格式与报表属性-〉Page Margin -> 下边界的大小有关

比如detail中有两列,当数据将第一列填充满时[根据detail页面大小]
会将数据自动填充到第二列[detail页面大小能决定什么时候第一列能被数据填充满]

多条数据在Detail中填充的时候是按照页面给显示数据所留大小填充的
控制显示多少行数据的时候严格按照页面能显示多少条数据来作出判断
按照条件显示的控件在不显示的时候仍然占据页面位置。

5。文字框中 Common 选项卡:
Print when expression 属性里是Boolean类型代表此字段的显示与否内容一般是:
new Boolean(结果是boolbean类型的表达式)


6。文字框中Font选项卡字体选择是成套的才能正确显示:
[1]  Font Name:选 宋体
PDF Font Name:选 STSong-Light
最后 PDF Encoding:选 UniGB-UCS2-H (Chinese Simplified)
[2]  引用外部字体如隶书
将字体文件放入iReport安装目录的fonts文件夹下如隶书[D:\iReport-3.0.0\fonts\SIMLI.TTF]
Font Name:选 隶书
PDF Font Name:选外部字体文件 隶书 (SIMLI.TTF)
最后 PDF Encoding:选 Identity-H (Unicode with horizontal writing)[是外部文件都选它]

7。动态文字框中 Text Field 选项卡:
中间有个 [复选框 Blank when null] 表示:当此文本框内容为空时是否显示null。
钩上表示为null时显示空白会比较好看些,不钩显示null。

8。$V{PAGE_COUNT} 表示当前是这页的第几条记录[在detail循环相关区域用]
$V{PAGE_NUMBER} 表示当前是第几页
$V{COLUMN_NUMBER} 表示detail有几字段

9。字段即列数在工具中编辑->报表属性->字段数中设置。
字段数把detail区分为相应的这些列,当一页中第一列显示不过了会自动跳到本页的第二列以此类推

10。报表中数据转换类型:
$V{PAGE_COUNT}.intValue() 报表中V属性转为int
Integer.valueOf($P{pageCount}).intValue() 报表中P属性转为int
Double.valueOf($F{realSum}) 报表中F类型转为Double
($V{realSums}.doublue()+$V{realSumMs}.doublue()) double类型相加求和
Boolean.valueOf(((List)$F{mentalState}).contains("02")) 将boolean值转为Boolbean

11。 报表中数据的操作:
文字框中的加法操作时:加号左右必须是数值类型如不是,加号就变成连接作用,而不是做加法操作了。
(($V{realSums}!=null?$V{realSums}:Double.valueOf(0)).doublue()
+
($V{realSumMs}!=null?$V{realSumMs}:Double.valueOf(0)).doublue())+" 元"

12。 报表中用到的一些方法:
contains()方法:((List)$F{mentalState}).contains("02") 从List类型的mentalState中查找 02 返回boolean值
equals()方法:用于两个String类型之间的比较
valueOf()方法括弧中间方的值只能是String类型的,不然编译会报错

13。 报表区域结构说明:
title 报表头[只在第一页的最上面显示]
pageHeader 页头[每一页都会显示]
columnHearder [和columnFooter作用差不多,columnHearder在detail之前显示]
detail [需要循环显示的东西在此处写]
columnFooter [展示在循环显示的下面]具有循环的$V{PAGE_COUNT}当前记录
pageFooter 报表尾[最后一页的最下方显示]
summary [此处用于做统计,显示的话用处不大]

猜你喜欢

转载自zhyp29.iteye.com/blog/2358617