【报表开发】iReport使用心得

来源:互联网 发布:python爬虫网页数据 编辑:程序博客网 时间:2024/06/06 04:25
  • Jasperreports被垂直分为若干个部分:
    • title band:只在整个报表的第一页最上面部分显示,除了第一页不管多少页面都不会再显示
    • pageHeader band:整个报表中每一个页面都会出现,位置在页面的上部,第一页显示在title band下面
    • pageFooter band:显示在所有页面的最下端
    • detail band:报表内容段,这个band中设计报表中需要重复出现的内容,detail段的内容每页都会出现
    • columnHeader band:针对detail band的表头段,一般情况下这个段中画报表的表头
    • columnFooter band:针对detail band的表尾段
    • summary band:表格的合计段,出现在整个报表的最后一页中的detail band的后面,一般用来统计报表

 
  • jasperreport中最基本的对象主要有七个:
    • Line
    • Rectangle
    • Ellipse
    • Static text
    • Text field
    • Image
    • Subreport
    • Crosstab
    • Chart
  •   每一个元素都必须在一个band内部,有一些通用属性如高度宽度位置,修改外观用属性,添加用组件


  •   一个style是一个预定义的属性的集合用来控制元素的外观(比如背景色,边框线,字体),fonts用来描述text的外观,其中定义一个字体:
    • font name:字体名称
    • font dimension:字体大小
    • attribute:属性,如加粗, 斜体,下划线等等
    • PDF Font Name:PDF字体名称
    • PDF Embedded:是用外部的TTF类别的字体生成报表时是否把它包含在PDF文件里
    • PDF Encoding:指定一个字体编码名称
        导出PDF格式时是用PDF字体,其他被忽略
        使用扩展TTF,那么字体文件必须放在classpath下    
        
  • 右键style 添加style,使用sthle时拖动style到元素上即可
  • jasperreport中有三种类型的对象可以用来保存数据,fields|parameters|variables,他们的类型是标准的java的object,需要使用必须先创建他们,在左边report inseptor中点击即可创建,点击也可更改属性:
  • fields:
    • 用来组织记录,必填两种,name和type,选填description, type可以时任何的java数据类型
    • 可以使用sql query 创建,在preview右边的按钮可以编辑sql query用于创建,fields 的数据类型构建在原始sql类型之上 ,也可以使用javabean(POJO)生成fields
  • parameters:
    • 通常使用来打印的时候从程序里传值到报表里,也就是说parameters通常的是起参数传递的作用
    • 可以设定default value在没有赋值时会使用default value的值,使用前必须先行创建
    • 在查询之中亦可以使用parameters:
      • select * from employee where dept_id = $p{deptId}
    • 程序中插入的话需要把相关的值放入到一个java.util.Map的类中,然后换到report里,使用的是JasperFillManager中的fillReport接口
    • 设定初始值,在需要的时候再向parameters传值,若没有初始化的值也没有对其赋值,其结果将为null
    • 对于一个parameters 我们不仅可以传递一个string,integer,boolean,还可以传送一些较大较复杂的对象,如图像(java.awt.Image),或者为一个子报表提供datasource链接,类型必须与parameters类型保持一致,否则抛出ClassCastException
    • 内嵌parameters类型:
                                            
                                            
  • variables:
    • 用来存储对某些字段计算后的结果
    • 必要属性:
      • variable name:名称,调用时使用$V{variable name}
      • variable class type:类型,可以是任意java类型
      • calctlation type:一个计算类型可以用来计算结果,预先定义值为nothing时,不作任何计算,jasperreports会根据指定类型和从数据源中获得的的每一条记录计算出结果然后更改variables的值,计算类型列举如下:
                                                        
                                                        
  • reset type:重置类型,表示一个变量在什么时候做重置操作:
                                                        
  • reset group:如果group reset type被勾选,这里就要选择group的名称
  • increment:指定一个variable值呗评估或当你想要这个组采用类似于subtotals或averages来计算
  • increment group:若这个group的increment type被勾选,它讲指定这个组决定variable的increment
  • custom increment factory class:指定实现了JRIncrementerFactory接口的java类名称
  • Variable Expression:一个java的expression,用来表示每一次variable迭代的值
  • initial value expression:为一个variable初始化时采用的expression
  • 内置variables:
                                                        
  • band中的print when expression中可以输入一个表达式,返回的值必须是java.lang.Boolean类型的对象,来灵活判断dangqianband是否输出如:($F{SALARY}.intValue()>4000?new Boolean(true):new Boolean(false))
  • Groups允许我们对报表里的数据进行全新的切割分组组合。分组通过一个表达式来定义,一个group有下面几个属性需要我们去定义:
    • group name:组名
    • start on a new page:如果勾选,不同分组将不会出现在同一页
    • start on a new column:如果勾选,分组只会在报表中的新的column产生
    • reset page number:允许在一个新组开始的时候重设页号
    • print header on  each page:在每一页都会打印该页的分组的header
    • min height to start new page:设置当前报表页面所余下高度的最小值,默认为0
    • group expression:分组时采用的表达式规则,如输入了$F{dept_id}表示按照员工的dept_id字段进行分组
    • group header band height:新产生的header band 的高度
    • group footer band height:新产生的footer band 的高度
            具体添加group:右键report inspector中的报表-->Add report group
  • 默认情况下,jasperreport不能对来自数据源的数据进行排序,若需要排序需要手动在sql中添加order by
  • 创建子报表的方法:组件面板中直接拖拽subreport进入detail即可,可选择已有的jrxml文件或者新建jrxml文件,新创建时需要注意的是:
    • 新创建的jrxml文件需要jdbc连接,以及sql语句
    • 选择字段进入fields
    • 制定groups
    • 需要注意的是,如果母报表需要传值给子报表时,需要按照一下步骤配置:
      • 母报表中选择子报表的属性,在parameters属性里面添加需要传递的参数,确认参数名字以及字段值
      • 在子报表的parameters里面添加参数名字的字段
      • 若需要按照参数进行分组或者查询,需要将参数写入到子报表的sql语句中
  • DataSource是Jasperreport获取数据以生成报表的源,有两种DataSource:
    • JDBC Connection用来从关系型数据库里取数据
    • 扩展了JRDataSource接口的java object        
  • 在不使用JDBC直接访问数据库时,我们需要使用JRDataSource,它是一个借口,允许我们访问具有行列结构的数据,无论JDBC Connection还是JRDataSource,都不能通过JasperReport来创建
  • 在ireport中的数据源有:
    • JDBC Connection
    • XML DataSource
    • JavaBean Collection DataSource
    • CSV DataSource
    • Custom DataSource
    • JRDataSourceProvider
    • Hibernate DataSource
            ireport在工作时同一时候总是使用一个DataSource或一个connection,因此需要设置一个active的datasource
  • 左边那个按钮进行创建DataSource,点击new 按钮之后有很多种选择,创建后选择相应的数据源即可,创建完成以后可以在报表中用$P{REPORT_CONNECTION}给报表来使用
  • 使用JavaBean set datasource ,它使用一个扩展类(工厂类)来生成我们所需要的javaBean对象
  • 使用JRDataSource时必须实现两个方法
    • public Boolean next()  :用来移动一个虚拟的游标到下一条记录,根据返回值判断是否还有记录,如果没有记录则返回false
    • public Object getFieldValue(JRField jrField)  :在next方法后如果返回true,就会调用getFieldValue方法,事实上报表里的每一个field在屈指的时候都会调用getFieldValue方法,其返回数据类型必须与申明的字段类型相匹配,null 除外
  • 使用Custom JRDataSource较为灵活,步骤如下:
    • 编写自己的JRDataSource,使用JRDataSource接口,实现上述两个方法
    • 在外包裹一层工厂类
    • 编译两个类为class
    • 在iReport的工具-->选项-->classpath下添加一个用于放置这两个类的文件夹
    • 将两个类的class文件放入classpath下添加的那个文件夹中
    • 在上面创建数据源的界面里创建数据源,选Custom JRDataSource
    • 填上工厂类的包括包名的全名以及工厂类中获取JRDataSource结构的函数名称,在例子中如:
    • 创建完毕后test一下,如果成功即可使用
    • 以下完整代码:
               JRSystemDataSource.java:
                    package test;

import java.io.File;
import java.util.Arrays;
import java.util.Collection;

import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRField;

public class JRSystemDataSource implements JRDataSource{
File[] fileArray;//存放文件的数组
int index = -1;//初试索引
//有路径参数的构造函数
public JRSystemDataSource(String path){
File f = new File(path);
if(f.exists() && f.isDirectory()){
fileArray = f.listFiles();
}
}
//默认构造
public JRSystemDataSource(){
this(".");
}
/*ireport从数组中取值的方法,具体需要获取的内容根据arg0.getName()来确定,通过判断其值来确定应该返回的字段值
 * 返回值类型:Object
 * 参数类型:JRField*/
public Object getFieldValue(JRField arg0) throws JRException{
File f = fileArray[index];
if(f==null)
return null;
if(arg0.getName().equals("filename")){
return f.getName();
}else if(arg0.getName().equals("isDir")){
return new Boolean(f.isDirectory());
}else if(arg0.getName().equals("size")){
return new Long(f.length());
}else{
return null;
}
}
/* iReport用来便利数组的方法,如果没有后续,则返回false,否则返回true,若返回true,将会执行getFieldValue方法
 * */
public boolean next() throws JRException{
boolean flag = false;
index++;
if(fileArray != null && index<fileArray.length){
flag = true;
}
return flag;
}
}

TestSystemDataSource.java:

package test;
import net.sf.jasperreports.engine.JRDataSource;
public class TestSystemDataSource {
//返回JRDataSource
public static JRDataSource getSystemData(){
return new JRSystemDataSource("d:/doc");
}
}

    • 例子中的情况下取filename,size和isDir,所以需要在iReport中添加同名的相应的field,然后需要使用的时候用$F{}即可     
  • Scriptlet是一个java class用来在报表生成的时候执行特定的动作
    • 编写一个java类,并扩展net.sf.jasperreports.engine.JRAbstractScriptlet,实现以下接口即可:

      • 形式如下图所示:
    • 在Scriptlet内部可以使用fields,variables和parameters的Map,分别是fieldsMap,variablesMap和parametersMap
  • iReport里的chart使用了jfreechart的最后版本,jfreechart是一个强大的chart生成工具
    • 具体创建并使用chart的方法例子:
      • 确定数据库中的数据,为了试验创建了一个新的表如下:

      • 在数据源中添加这个数据库的链接
      • 编写sql语句如:
      • 拖拽组件栏中的chart进入summary band
      • 选择饼状图,配置参数如图,上面的栏是每一弧的名称的表达式,下一栏是每一弧的值的表达式

      • 这样就完成了基本的配置,然后preview一下就可以看到效果了
      • 在chart 的char data中有更详细的设置:
        • 在Details中有三个填写表达式的地方,分别是:
          • Key expression:上图中地下方框中的值的表达式,表示每种颜色对应的意义
          • Value expression:顾名思义,饼状图每一块大小的值的表达式,在图中表现为不同区域颜色的的大小
          • Label expression:饼状图旁边标签的值得表达式,必须为String类型,如果是int类型的记得用toString()转换一下
      • 在chart的属性中也有一些其他参数的详细设计
      • 另外在chart中可以使用sub dataset,方法如下
        • 右键Report Inspector中的报表,选择Add Dataset,添加新的dataset
        • 按照编辑平常dataset一样编辑,即可创立子dataset
        • 在chart的Chart Data中的Dataset标签下,在Dataset run中的将Sub dataset选定为创立的dataset即可使用子dataset进行chart绘制,而不影响原报表的整体内容

        • 所以,绘制chart时尽量使用新建的dataset
    • crosstab的使用实例:
      • 创建一个表如下,其至少有两个字段,用于做crosstab的两个分类栏:

      • 从组件栏中拖拽crosstab到summary中,并设定各个行列代表的意义如下:



      • 红色代表当前设定的位置的意义,这里设定的是左为degree的头,而上为header的头,中间则是复合两个分类的id 的统计个数(Count)
      • 另外还有一些样式设计如图:

        • 这里重要的是Add row group totals和Add column group totals,分别是横行和竖列的统计栏,需要可以添加
        • 上面color scheme则是样式,Variations则是横竖栏的样式,show grid lines表示是否显示表格见的分隔线
      • 设定好的crosstab如图所示:

        • 点击各个小的格子,可以设定各个格子的长宽等基本属性,拉动文字框大小之前先拉大表格大小
        • 在Report Inspector中的crosstab组件的Row Groups或者column Groups上右键可以添加新的分组,并可在其属性中更改其表达式等,如在本例中,添加一个新的分组second如下所示:

          • 之后原crosstab改变成:

          • 其中的表达式为:$F{degree}.equals( $F{header} )
          • 可以看到结果的crosstab更改为如下所示,按照degree是否和header再次分组:

        • bucket是分组的标准,在一个bucket表达式里可以使用主报表里所有的fields 、variables、parameters,但是如果使用subdataset来填充,则不需使用subdataset里提供的fields、variables、parameters
        • 在分组的属性里可以选择Total position:
          • None:没有总计行
          • Start:总计行打印在detail行之前
          • End:总计行答应在detail行之后
      • 在整个crosstab有一些属性:
        • Repeat column headers:如果勾选,crosstab完全添加到页面中时列的header将会被重复打印
        • Report row headers:如果勾选,当crosstab完全添加到页面中时这个行headers将会被重复打印
        • Column break offset:当crosstab超过页面宽度时指定上一块数据与下一块数据之间的空白间隔
原创粉丝点击