当前位置: 首页 > 工具软件 > Jasper > 使用案例 >

JasperReport 种介绍

宇文修筠
2023-12-01

JasperReport 种介绍

By sukalla   at 2014-05-30   11 阅读   0 回复   0.0 希赛币
请点击下面回答中的"采纳为答案"按钮,选择贡献(希赛币)比率后,点击"确认结算"按钮。
   
合计00% 
(转)JasperReport 类介绍
URL:





JasperReport
2.1      简介
JasperReport 是产生报表的核心部分,首先要先有个xml文件,然后根据jasperreports.dtd编译成jasper文件(以.jasper结尾),我们真正要使用的是编译以后的.jasper文件。xml文件的内容包括对报表样式的定义,数据来源,参数等等,它可以支持的输出格式:PDF,HTML,XML,XLS,CVS等。

在没有iReport之前,需要花费大量的时间去熟悉JasperReport的文档以及自己去写定义报表的xml,现在你一定对iReport的作用有些了解吧

2.2      工作流程介绍

如果我们已经用iReport已经将xml编译为.japser文件后,上图中编译部分的工作就可以省略,JasperFillManager根据定义的数据源和报表模版填充jasperPrint,有数据的报表就在这个部分填充的。如果我们要导出到不同类型的档案,则需要通过 JasperExportMananger,也可以自己写一个类,但是要实现net.sf.jasperreports.engine. JRExporter这个接口。JaserReport提供的exporter再下面一节介绍。

2.3      重要的Class和Interface详细介绍
         Class net.sf.jasperreports.engine.JasperReport
这个类的对象通过net.sf.jasperreports.engine.util.JRLoader从.jasper文件中获取,为用数据填充和产生报表做准备,当用数据填充报表的时候,运行时求各种各样报表表达式的值。对象中包含了报表的各种元素,例如报表的大小,显示位置,显示的栏位,图片信息等等。

         Class net.sf.jasperreports.engine.util.JRLoader

所有JasperReports 主要的功能,象报表编辑,报表填充及导出,经常用到序列化的对象,net.sf.jasperreports.engine.util.JRLoader可以帮助从文件或者URLs或者输入流中装载这些被序列化的对象。

         Class net.sf.jasperreports.engine.JasperPrint

这个类的对象是通过填充类根据net.sf.jasperreports.engine.JasperReport的对象用数据填充后的结果,这样可以被很直观的被别的类引用,将报表输出到网络或者文件

         Interface net.sf.jasperreports.engine.JRDataSource

JasperReports是一个非常灵活的报表工具,在数据来源方面更是体现了这一点,程序员可以自己定义不同类型的数据源,前提是实现这个接口,我们的数据源就可以千变万化,数据源可以是XML,CSV,TEXT,Object List 等等,在后面的章节详细描述如何实现该接口

         Class net.sf.jasperreports.engine.export.JExcelApiExporter

报表产生到一个EXCEL文档,如果报表里面有图形,一定要用这个exporter

         Class net.sf.jasperreports.engine.export.JRCsvExporter

报表产生到一个CVS文档

         Class net.sf.jasperreports.engine.export.JRGraphics2Dexporter

报表输出到Graphics2D,Java2D应用的时候才会用到

         Class net.sf.jasperreports.engine.export.JRHtmlExporter

报表产生到一个HTML文档

         Class net.sf.jasperreports.engine.export.JRPdfExporter

报表产生到一个PDF文档

         Class net.sf.jasperreports.engine.export.JRRtfExporter

报表产生到一个RTF文档

         Class net.sf.jasperreports.engine.export.JRTextExporter

报表产生到一个TXT文档

         Class net.sf.jasperreports.engine.export.JRXlsExporter

报表产生到EXCEL文档,用这个exporter,报表中的图形将不被输出

         Class net.sf.jasperreports.engine.export.JRTextExporter

报表产生到XML文档

2.4      Exporter常用参数说明

         net.sf.jasperreports.engine.JRExporterParameter. JASPER_PRINT

这个参数是net.sf.jasperreports.engine.JasperPrint的对象,exporter在导出报表前会做检测

         net.sf.jasperreports.engine.JRExporterParameter. JASPER_PRINT_LIST

这个参数是包含了n个net.sf.jasperreports.engine.JasperPrint对象的java.util.List,exporter在导出报表前会做检测

         net.sf.jasperreports.engine.JRExporterParameter.INPUT_STREAM

这个参数是net.sf.jasperreports.engine.JasperPrint被序列化对象的输入流,exporter在导出报表前会做检测

         net.sf.jasperreports.engine.JRExporterParameter.INPUT_URL

这个参数是包含net.sf.jasperreports.engine.JasperPrint被序列化对象的URL,exporter在导出报表前会做检测

         net.sf.jasperreports.engine.JRExporterParameter.INPUT_FILE_NAME

这个参数是存储了net.sf.jasperreports.engine.JasperPrint被序列化对象的文件路径,exporter在导出报表前会做检测

注意:以上几个参数不能全部为空

         net.sf.jasperreports.engine.JRExporterParameter.OUTPUT_STRING_BUFFER

这个参数是java.lang.StringBuffer的对象,存储已经产生出的指定格式报表的内容

         net.sf.jasperreports.engine.JRExporterParameter.OUTPUT_WRITER

这个参数是java.io.Writer的对象,将指定格式报表的内容发送到一个字符流,例如Servlet的PrintWriter

         net.sf.jasperreports.engine.JRExporterParameter.OUTPUT_STREAM

这个参数是java.io.OutputStream的对象,将指定格式报表的内容发送到一个输出流,例如ServletOutputStream

         net.sf.jasperreports.engine.JRExporterParameter.OUTPUT_FILE

这个参数是java.io.FILE的对象,将指定格式报表的内容存储到文件里面

         net.sf.jasperreports.engine.JRExporterParameter.OUTPUT_FILE_NAME

这个参数是java.lang.String的对象,将指定格式报表的内容存储到文件里面

         net.sf.jasperreports.engine.JRExporterParameter.CHARACTER_ENCODING

这个参数是java.lang.String的对象,指定格式报表的内容编码

         net.sf.jasperreports.engine.JExcelApiExporterParameter.IS_FONT_SIZE_FIX_ENABLED

这个参数是java.lang.Boolean的对象,是否允许自动修正Excel每个栏位的大小

         net.sf.jasperreports.engine.JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET

这个参数是java.lang.Boolean的对象,每一页是否用一个Sheet

         net.sf.jasperreports.engine.JRXlsExporterParameter. IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS

这个参数是java.lang.Boolean的对象,是否移除行与行之间的空行

         net.sf.jasperreports.engine.JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND

这个参数是java.lang.Boolean的对象,页面的背景是否为白的

         net.sf.jasperreports.engine.JRXlsExporterParameter.SHEET_NAMES

这个参数是java.lang.String的对象,Sheet的名字

         net.sf.jasperreports.engine.JRCsvExporterParameter.FIELD_DELIMITER

这个参数是java.lang.String的对象,栏位之间的分隔符

         net.sf.jasperreports.engine.JRCsvExporterParameter.RECORD_DELIMITER

这个参数是java.lang.String的对象,栏位之间的分隔符

         net.sf.jasperreports.engine.JRHtmlExporterParameter.IS_OUTPUT_IMAGES_TO_DIR

这个参数是java.lang.Boolean的对象,是否输出图片到目录

         net.sf.jasperreports.engine.JRHtmlExporterParameter.IMAGES_DIR_NAME

这个参数是java.lang.String的对象,图片目录的绝对路径

         net.sf.jasperreports.engine.JRHtmlExporterParameter.IMAGES_DIR

这个参数是java.io.File的对象,图片目录

         net.sf.jasperreports.engine.JRHtmlExporterParameter.IMAGES_URI

这个参数是java.lang.String的对象,通过Web访问时图片的URI

2.5      JasperReport内置的常用参数说明

这些参数是放到java.util.Map,在填充报表的时候使用

         REPORT_CONNECTION

这个参数是java.sql.Connection对象,在用Report Query的时候调用

         REPORT_DATASOURCE

这个参数是实现了接口net.sf.jasperreports.engine.JRDataSource的对象,在填充报表的时候调用

         IS_IGNORE_PAGINATION

这个参数是java.lang.Boolean对象,报表是否忽略分页

         REPORT_MAX_COUNT

这个参数是java.lang.Integer对象,报表显示的最大记录数

         DRAWING_SUPPLIER

这个参数是实现了接口org.jfree.chart.plot.DrawingSupplier对象,定义自己的填充色

这个参数不是原来JasperReport定义的,是后来加上的

2.6      JasperReport内置的常用变量说明

         PAGE_NUMBER

当前页面的页码,即第几页

         REPORT_COUNT

整个报表填充完成后,总的记录数

         PAGE_COUNT

当前页面的记录数

         COLUMN_COUNT

当前记录的行数,每个页面的计数会复位后重新计算。

2.7      如何实现接口JRDataSource

当调用填充报表过程的时候,负责填充的类会通过这个接口获取到相应的数据,jasperreport提供了几个实现了这个接口的类:

         net.sf.jasperreports.engine.JRResultSetDataSource

这个是通过JDBC访问关系数据库得到的数据源

         net.sf.jasperreports.engine.data.JRTableModelDataSource

这个是调用Java Swing tables得到的数据源

         net.sf.jasperreports.engine.data.JRBeanCollectionDataSource

这个是调用collections得到的数据源

我们要定义自己的DataSource,需要实现下面两个方法:

2        public boolean next() throws JRException;

报表填充数据的时候,填充每一条记录之前都会调用这个方法,将指针移动到下一条数据,如果有下一条数据返回true,否则返回false。

2         public Object getFieldValue(JRField jrField) throws JRException;

当填充报表的每一个栏位的时候,会调用这个方法获取填充的值。JrField是报表里面定义显示栏位的对象。在iReport工具里面可以定义jrField的名字类型以及description

2.8      JasperReport如何绘制图形报表

JasperReport本身是不绘制图形报表的,JasperReport是通过调用JFreeChart产生的image显示到报表的页面里,所以我们还需要再了解JFreeChart,我们将再后面的章节介绍JFreeChart。

3         iReport

3.1      简介

iReport 就是一个可视化的报表制作工具,代替原来人工书写定义报表的xml,我们可以用iReport做下面的一些工作:

n         用iReport可以画出我们需要的报表的模版,例如在某个位置显示甚么内容,显示风格的定义等等

n         定义需要传给jasperReport的参数,例如前面一章将提到的内置参数,也可以自定义需要传递的参数

n         iReport的提供的功能可以预览报表

n         将报表模版的xml编译为.jasper文件,供jasperreport调用生成我们需要的报表

n         除了可以使用前面一章提到的内置变量,我们也可以定义自己的变量

3.2      报表模版布局

3.2.1 区域位置介绍

      一般情况下规则如下:

n         title

这个区域的资料整个报表只显示一次

n         pageHeader

这个区域的资料每一页的顶部显示一次

n         columnHeader

这个区域的资料每一页的顶部显示一次,位置在pageHeader的后面

n         detail

这个区域的资料有多少笔记录就显示多少次

n         columnFooter

这个区域的资料每一页的底部只显示一次,位置在pageFooter,lastPageFooter的前面

n         pageFooter

这个区域的资料每一页的底部只显示一次,如果有定义lastPageFooter,则最后一页不显示

n         lastPageFooter

这个区域的资料在报表最后一页的底部只显示一次

n         summary

这个区域的资料在最后一条记录后面显示,位置在columnFooter, pageFooter,lastPageFooter的前面

3.2.2 如何设置区域

点击工具栏的 ,会弹出下面的窗口,在Band height处输入高度后,点Apply按钮就可以了。


3.3      如何定义Fields,Parameters,Variables

报表的显示数据基本由这三个部分组成。

Fields指的是定义的数据源中对象的属性

Parameters指的是在调用填充报表的对象前,将所需要的参数放到Map对象里

Variables指的是按一定的逻辑通过调用Fields或者Parameters或者Variables组织一个计算表达式

点击工具栏 ,弹出一个对象属性的窗口

         Fields

点击新增按钮增加一个field,field包括3个特性:

name:唯一标识

Class type:表示field是哪个类的对象例如:java.lang.Integer等等,不能为基本变量类型如int,double等

Description:field的描述,在特定应用时会用到,例如自己定义的xml数据源,可能需要从不同的Node获取资料,这个时候需要通过description来识别,在后面的具体制作报表的时候可以看到这点。

JasperReport会通过这几个属性产生一个JRField的对象。

在报表模版里书写的标识为$F{field name}

         Variables

我们可以看到里面已经有一些变量了,这些就是在JasperReport提到的它的内置变量。

点击新增按钮,弹出的窗口中包括定义Variable name,Variable class type, Calculation type,Variable expression,Initial value expression等等。

Variable name :变量的名字可以和Fields或者Parameters的名字相同,但是不能和其他的变量名字一样

Variable class type:表示变量是哪个类的对象,例如java.lang.Integer等等,不能为基本变量类型如int,double等

Calculation type:常用的包括count,sum, average等等

Variable expression:可以是之前的$F{field name},也可以是自己或者其它的变量

Initial value expression:类型一定要和选择的Variable class type一致

在报表模版里书写的标识为$V{variable name}

         Parameters

我们可以看到里面已经有一些参数的定义了,这些就是在JasperReport提到的它的内置参数。

点击新增按钮,弹出的窗口中包括定义Parameter name,Parameter class type, Parameter default value,Parameter description等等

Parameter name:参数名称,其实就是Map的key,所以参数名称不能重复

Parameter class type:表示参数是那个类的对象,即Map中key对应的对象类型

Parameter default value:表示参数为空的时候,赋与的一个值,类型必须和选择的Parameter class type一致

Parameter description:描述栏位,保留栏位

在报表模版里书写的标识为$P{parameter name}

3.4      报表模版主要元件

所有元件在正确的区域内时,当鼠标点击该元件,边框颜色均为蓝色

如果不在正确的区域时,当鼠标点击该元件,边框颜色为红色

如果多个元件重叠,当鼠标点击该元件,边框颜色为绿色

所有元件基本有共同的几个属性,右键点击元件从弹出的菜单中选择properties,弹出一个属性窗口:

Common里面包括:绑定的区域信息,绝对位置和大小,前景色,背景色等等。

Print when expression表示满足甚么条件的时候显示,表达式必须返回一个Boolean的对象

Font里面包括:字体大小,文字位置,文字字体等等,如果是中文或者是亚洲其他语言,当输出为PDF格式时候,需要设定Font是:

Language
PDF Font Name

Simplified Chinese
STSong-Light

Traditional Chinese
MHei-Medium

MSung-Light

Japanese
HeiseiKakuGo-W5

HeiseiMin-W3

Korean
HYGoThic-Medium

HYSMyeongJo-Medium

Border里面包括:边框的线条颜色,粗细,框内文字距离边框的距离等等

3.4.1 直线

点击工具栏 ,可以在报表的任意区域画一条直线

3.4.2 静态的文字

点击工具栏 ,可以在任意区域画一个文本框, 在它的属性窗口输入想要显示的文字

3.4.3 文字字段

点击工具栏 ,可以在任意区域画一个文本框,在属性框输入要显示的Field, Variable,Parameter

Textfield Expression Class:必须和定义的类型一致,目前只支持下面的类型:

java.lang.Boolean

java.lang.Byte

java.util.Date

java.sql.Timestamp

java.lang.Double

java.lang.Float

java.lang.Integer

java.lang.Long

java.lang.Short

java.math.BigDecimal

java.lang.String

Evaluation time:赋值时间一般选择now

Stretch with overflow:当文字超出边框时是否自动延长

Banlk when null:当内容为空指针的时候是否显示空格

Pattern:显示的式样,如果为Number类型或者日期类型时可以建立特定的显示式样

Textfield expression:表达式可以为$F{field},$V{variable},$P{parameter}

3.4.4 图象

点击工具栏 ,可以在任意区域插入图象,在属性窗口输入图象的来源

Image Expression:图象来源的表达式,一般情况下选择Image Expression Class为java.lang.String时,表达式为图象的绝对路径,可以通过$F{field},$P{parameter}来传递,也可以通过 Find按钮找到本地需要显示的图象路径。

Image Expression Class:图象来源的对象类型,根据不同的类型,Image Expression就要传递该类型的对象

3.4.5 子报表

点击工具栏的 ,可以在detail,summary区域插入子报表,下面是子报表的属性:

u       窗口1

Paramters Map Expression:这个是传递给子报表的参数表,类型一定是java.util.Map,子报表的参数还可以通过别的方式传递,在下面窗口2中有描述。

Connetion / Datasouce Expression:这个是子报表的数据源,一般情况下是用JRDataSource,这里写的$P{MY_DATA_SOURCE},表示子报表数据源是通过父报表参数传递的,因此要在参数表那里定义。

u       窗口2

Subreport Expression Class:子报表的类型,通常选择如图中所示的类型,这个参数也是通过父报表的参数来传递,因此要在参数中定义它。

SubReport parameters:子报表的参数,这个地方的参数和窗口1的Paramters Map功能一样,提供参数给子报表,区别是这个地方可以将父报表的一些具体的资料通过map传递给子报表。

3.4.6 图形报表

点击工具栏的 ,可以在任何区域插入它,具体的图形报表制作将在后面的章节详细描述。

3.5      编译报表

当我们画好报表模版后,保存到硬盘上的只是xml 档案,因此需要编译为.jasper的档案,

点击工具栏的 ,如果我们画好的报表没有问题,将产生一个.jasper的档案,如果有错误,将在iReport的下方信息窗口显示出错的信息,为我们纠正错误提供帮助。

4         JFreeChart

4.1      简介

主要用来开发各种各样的图形报表,这些图形报表包括:饼图、柱状图(普通柱状图以及堆栈柱状图)、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等等。在这些不同式样的图形报表上可以满足目前商业系统的要求。JFreeChart是一种基于JAVA 2D的图形报表开发技术。JFreeChart可用于Servlet、JSP、Applet、Java Appication环境中,通过JDBC可动态显示任何数据库数据,结合Itext可以输出至PDF文档。


4.2      几个重要的Class和Interface介绍

         Class org.jfree.chart.ChartFactory

这个类负责产生各种图形的org.jfree.chart.JFreeChart的对象,JasperReport通过调用org.jfree.chart.ChartFactory的方法获取到相应图形的org.jfree.chart.JfreeChar的对象。


         Class org.jfree.chart.JFreeChart

这个类实现了Java 2D APIs,它的目的是在Java 2D graphics device上绘出想要的图像


         Interface org.jfree.data.category.CategoryDataset

用于图形生成所要的数据集对象,实现这个接口的Dataset主要用于3D数据,例如Bar,Group Bar,Line,StackedBar 等等


         Interface org.jfree.data.category.PieDataset

用于图形生成所要的数据集对象,实现这个接口的Dataset主要用于2D数据,例如Pie

         Interface org.jfree.chart.plot.DrawingSupplier

java.awt.Paint及java.awt.Stroke 对象的提供者,可以通过实现它自己定义Chart的颜色

         Abstract Class org.jfree.chart.plot.Plot

这个抽象类以及所有子类做为org.jfree.chart.JFreeChart的代理,在Java 2D graphics device绘出坐标以及数据区域的图像

         Abstract Class org.jfree.chart.renderer.AbstractRenderer

这个抽象类以及所有子类主要用在3D数据时在Java 2D graphics device绘出每个区域的颜色,每个区域轮廓的颜色,每个区域上的数值

4.3      JasperReport如何调用JFreeChart产生图形报表

JasperReport在用数据填充报表时,根据图形报表的类型,生成对应的JFreeChart的Dataset对象,再调用 org.jfree.chart.ChartFactory产生出对应的org.jfree.chart.JFreeChart对象。获取到该对象后,JasperReport在exporter里建立一个java.awt.image.BufferedImage对象,

BufferedImage返回一个java.awt.Graphics2D对象,再将它传入给之前JFreeChart对象,最后调用JFreeChart对象的draw方法将图形输出到BufferedImage对象,供给Exporter使用。

类net.sf.jasperreports.engine.design.JasperDesign

    之所以从这个类开始,是因为它的实例是jasperreport用于报表产生的原始类,比如,该类实例在用于产生报表的xml文件被解析后获得,或者不产生xml文档而是由调用jasperreport的应用程序产生。在所给的例子中有一个(noxmldesign)就是在不产生xml文件的情况下动态生成该实例的一个例子。所有该类的实例都属于报表的填充和产生以前产生的,所以我们称之为原始类。



类net.sf.jasperreports.engine.design.jasperreport

     该类实例表现了报表设计对象,是作为报表的编译过程的结果而被实例化,是向报表中填充数据的准备。在报表的编译过程中协同验证报表元素的合法性,一致性;同时创建了临时文件存储报表中所有的变量,表达式。编译过程中会先查找classpath中tools.jar或者Ant进行编译,编译结果以字节码的形式存储,并且在填充数据时用于判断多种产生报表的形式

类net.sf.jasperreports.engine.design.JasperCompileManager

该类允许用户从文件,流等多种形式编译xml,允许直接传递JasperDesign对象并接收相应的JasperReport对象,它是将报表设计xml文件编译为等待填充的报表文件的入口类。其他方法:验证报表合法性,构建JasperDesign类的实例也是十分有用的,尤其是针对可视化编辑器

类net.sf.jasperreports.engine.design.JasperPrint

报表填充完毕后产生该类的实例,这个对象可以被JasperReport内置报表浏览工具浏览,或者序列化存储、发送等。该类的实例表现了JasperReport的报表输出;除了作为标准格式以页面形式存储外还可以转化为PDF, HTML, XML等多种形式。

类net.sf.jasperreports.engine.design.JRDataSource

就报表数据来说,JasperReport是十分灵活的,提供多种数据源,针对各种数据源都有相应的编程接口,每次报表填充时,都会产生特定场景的引擎实例

net.sf.jasperreports.view.JasperViewer
此类用来预览生成的报表(generated reports.)。

net.sf.jasperreports.view.JasperDesignViewer
此类用来预览报表设计(view the report design)

<%@ page import="dori.jasper.engine.*" %>
  <%@ page import="java.util.*" %>
  <%@ page import="java.io.*" %>
  <%@ page import="java.sql.*" %>
  <%
   File reportFile = new File(application.getRealPath("/reports/mydoc5.jasper"));
   Map parameters = new HashMap();
  
   Class.forName("org.gjt.mm.mysql.Driver").newInstance();
   String url ="jdbc:mysql://localhost/clients user=sa&password=&useUnicode=true&characterEncoding=GB2312";
   Connection conn= DriverManager.getConnection(url);
  
   byte[] bytes =
   JasperRunManager.runReportToPdf(
   reportFile.getPath(),
   parameters,
   conn
   );
  
   response.setContentType("application/pdf");
   response.setContentLength(bytes.length);
   ServletOutputStream ouputStream = response.getOutputStream();
   ouputStream.write(bytes, 0, bytes.length);
   ouputStream.flush();
   ouputStream.close();
  
  %>
   note:
   1)<%@ page contentType="text/html;charset=gb2312"%> 这句话不能有,不然会提示下载
   2)从数据库中获取中文数据Encoding=GB2312是必须的
 类似资料: