环境配置
1 正确安装配置 java 的jdk
2 将ireport放到c:/ireport
3 将ant放到c:/ant(我用的是bea的ant路径是D:/bea/weblogic81/server/ant)
4 将jasperreports-1.2.0.jar 放置到当前classpath中(没有加,我使用的Ireport/lib下已经存在了)
5 将itext-1.3.1.jar放置到c:/ireport/lib(没有加,我使用的Ireport/lib下已经存在了)
6 修改ireport/ireport.bat文件,加入以下内容
set JAVA_HOME=C:/j2sdk1.4.2
set ANT_HOME=D:/bea/weblogic81/server/
set IREPORT_HOME=c:/ireport rem %ANT_HOME%/bin/ant javadocs %ANT_HOME%/bin/ant iReport
我修改的是:
set JAVA_HOME=C:/j2sdk1.4.2
set ANT_HOME=D:/bea/weblogic81/server/
set IREPORT_HOME=F:/backup/iReport-1.2.0 rem %ANT_HOME%/bin/ant javadocs %ANT_HOME%/bin/ant iReport
(不过对以上修改,感觉没有什么用处)
7 提供一个正常提供服务的数据库
现在高版本的ireport是不需要进行配置,可以直接使用的.
了解制作报表用的包
1 jasperreports-1.0.1.jar jasperreports是iReport的核心内容,jsperreport是一个 报表 制作程序,用它的规则制定一个xml文件,然后编译生成一个.jsper文件,这个.jsper文件是我们真正使用的,它很象.jsp文件,使用的是它编译后的servlet. ( http://jasperreports.sourceforge.net/)
2 itext-1.3.1.jar iText是一个开放源码的Java类库,是用来生成PDF文件的。如果要在生成的pdf文件显示中文等亚洲字符,还必须下载itext的亚洲字符包iTextAsian.jar ( http://itextdocs.lowagie.com/downloads/iTextAsian.jar)
3 jfreechart-1.0.0-rc1.jar jfreechart是一款免费的、功能强大的统计图生成工具,可以直接生成PNG,JPG等各式的文件。 ( http://www.jfree.org/jfreechart/)
4 jcommon-1.0.0-rc1.jar JCommon是一组有用的classes集合.它已经用在JFreeChart,JFreeReport与其它 项目 上. 这个类库包含了以下功能: 文本工具类(text utilities), 用来显示关于应用程序信息的用户界面类, 布局定制管理器, 一个日期选择面板, 序列化工具类, XML解析器支持类. ( http://www.jfree.org/jcommon/)
5 poi-2.0-final-20040126.jar Apache的Jakata项目的POI子项目,目标是处理ole2对象。目前比较成熟的是HSSF接口,处理MS Excel(97-2002)对象。它不象我们仅仅是用csv生成的没有格式的可以由Excel转换的东西,而是真正的Excel对象,你可以 控制 一些属性如sheet,cell等等。直接调用poi包的不是ireport,而是jasperreport。 ( http://www.apache.org/dyn/closer.cgi/jakarta/poi/)
使用介绍
1 启动:点击ireport/ireport.bat启动
2 修改语言环境:tools-option-general中language中更改-apply
3 创建报表 file-new document 输入名字-ok Portrait是纵向,Landscape是横向。
4 连接数据源 datasource-connection/datasource-new-connections porperties- 输入名字-选择jdbc Driver,jdbc url-输入username和password,-test测试通过表明数据源连接正确-save保存 (注意:必须保证数据库驱动在lib目录下)
5 基本域说明
title域用来放报表的总标题
pageHeaher域顾名思义页头
columnHeader域是用来放static text的,也就是不循环的部分。
detail域是用来放text field的,也就是循环部分。
pageFooter域是用来放本页的统计参数的。
summary域是用来放整个表的统计参数的。
可以直接调整每个域的长度,也可以通过Band properties来调整 (在我的项目中,只设置的title和detail,在title中显示报表的总标题和所有parameters字段,在detail中显示需要循环的列表字段)
6 在报表中添加字段static text edit-insert element -static text 鼠标拖拉添加在页面中双击或者右键properties在static text Tab 中输入字段名字,如果显示有乱码,font-font name中选择"中文GB2312" border 中可以设置表格边线样式
7 在报表中添加字段text field edit-insert element -text field 鼠标拖拉添加在页面中双击或者右键properties在text field 中输入字段名字, 样式如同$F{text_field_name},
f表示为field变量,是数据库中抽取出来的,你想在报表中显示的数据库内容,
p为parameter参数,是应用需要提供给报表的入口,比如想在报表被解释的时候提供where语句的条件值, 就 可以用 $P(parameterName)比如: select * from bugs where proname=$P{projectName} order by proname,modulename
v为变量(显示字体颜色为绿色,表示格式正确) border 中可以设置表格边线样式
8 调整报表布局鼠标拖动各个字段,拼接想要的报表布局,如果鼠标点击字段, 显示为红色,说明该字段跨越了两个域显示为绿色,说明两个字段叠加显示为蓝色,说明该字段位置正确
9 报表添加SQL查询语句 资料来源->报表查询(datasource-report query) 在Report SQL query里填写SQl语句。如果语句正确,在下面的field里就会显示正常的表字段。 (可以从显示的所有字段中选取想用做field的字段,点击ok后,自动添加为field动态字段)
10 为报表添加动态字段预览->报表字段(view-Fields) 新建一个字段,字段名字必须和报表中Fields中添加名字一直,同时必须是sql结果集中存在的. (把fields里的字段直接拖到报表上也行)
11 为SQL语句添加参数 预览->报表参数(view-parameters) 在parameters里新增一个参数 paratemeter name 是参数名,在SQL语句里写成"$P{参数名}" paratemeter class type里选择参数类型。 注意:如果是int型的数据,最好在报表字段里将该字段的Class type改成java.lang.String型的。 另外一种办法,不管该字段原来是什么数据类型,直接在paratemeter class type里选择java.lang.String类型, 后在Default value expression 填写"Integer.toString(整数)"。
12 添加报表变量 预览->报表变量 $V{变量名}(没有用到过!)
13 处理字体 选中字段->右键->properties->font(双击也可以) Report font 选择全局的字体(仅限于该报表) Font name 选择在ireport里面显示的字体 Pdf font name 选择在pdf里面显示的字体 Rotation 选择内容是否旋转(很有用的选项) PDF Encoding 中文要用UniGB-UCS2-H,外部字体要选Identity-H
14 设定该报表的全局字体 预览->报表字型(view-font)
15 编译jrxml 建立->编译 (build-compile) 编译后生成一个后缀名为jasper的binary文件,可以直接给程序调用。
web项目应用
1 jsp输出PDF报表
需要放到项目里的包 itext-1.3.1.jar iTextAsian.jar jasperreports-1.0.1.jar jsp
输出PDF的例子
{
<%@ page import="java.sql.*" %>
<%@ page import="java.util.*" %>
<%@ page import="java.io.*" %>
<%@ page import="net.sf.jasperreports.engine.JasperFillManager"%>
<%@ page import="net.sf.jasperreports.engine.JasperPrint"%>
<%@ page import="net.sf.jasperreports.engine.JRException"%>
<%@ page import="net.sf.jasperreports.engine.JasperRunManager"%>
<%
String rowid = "1";//初始化变量
Connection conn= DriverManager.getConnection("proxool.test");//从数据源连接数据库
//装载jasper文件application
File exe_rpt = new File(application.getRealPath("/reports/test.jasper"));
//rowid就是iReport的变量$P{rowid}的名称
Map parameters = new HashMap();
parameters.put("rowid",rowid);
try{
// fill
JasperPrint jasperPrint = JasperFillManager.fillReport(exe_rpt.getPath(),parameters,conn);
// 生成pdf
byte[] bytes = JasperRunManager.runReportToPdf(exe_rpt.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();
conn.close();
}catch(JRException ex){
out.print("Jasper Output Error:"+ex.getMessage());
}
%>
}
jsp输出EXCEL报表
需要放到项目里的包 jasperreports-1.0.1.jar poi-2.0-final-20040126.jar
输出excel要注意的:
(1) 输出excel报表必须fields的边界刚好填充满整个页面,不然会有大量的空白出现。
(2) 删除记录最下面的空行需要加上参数 exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,Boolean.TRUE);
(3) 删除多余的ColumnHeader需要加上参数 exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,Boolean.FALSE);
(4) 在ireport里给fields加上border,那输出的excel就会有很黑的边框,跟excel默认的灰度边框就会很不协调。但是如果不加border,在输出的excel里就不会显示每个表格的边框。
解决 方法 是: 第一步 在选中字段->右键->properties->Common->Transparent 打上勾。 第二步 在输出的jsp页面加上参数 exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND,Boolean.FALSE);
2 jsp输出EXCEL的例子
{
<%@ page import="java.sql.*" %>
<%@ page import="java.util.*" %>
<%@ page import="java.io.*" %>
<%@ page import="net.sf.jasperreports.engine.JasperFillManager" %>
<%@ page import="net.sf.jasperreports.engine.JasperPrint"%>
<%@ page import="net.sf.jasperreports.engine.JRException"%>
<%@ page import="net.sf.jasperreports.engine.JRExporterParameter"%>//excel
<%@ page import="net.sf.jasperreports.engine.export.JRXlsExporterParameter"%>//excel
<%@ page import="net.sf.jasperreports.engine.export.JRXlsExporter"%>//excel
<%
String rowid = "1";
Connection conn= DriverManager.getConnection("proxool.test");
//装载jasper文件application
File exe_rpt = new File(application.getRealPath("/excel/test_excel.jasper"));
//rowid就是iReport的变量$P{rowid}的名称
Map parameters = new HashMap();
parameters.put("rowid",rowid);
try{
// fill
JasperPrint jasperPrint = JasperFillManager.fillReport(exe_rpt.getPath(),parameters,conn);
// excel输出
ByteArrayOutputStream oStream = new ByteArrayOutputStream();
JRXlsExporter exporter = new JRXlsExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, oStream);
exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,Boolean.TRUE); // 删除记录最下面的空行
exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,Boolean.FALSE);// 删除多余的ColumnHeader
exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND,Boolean.FALSE);// 显示边框
exporter.exportReport();
byte[] bytes = oStream.toByteArray();
if(bytes != null && bytes.length > 0) {
response.reset();
response.setContentType("application/vnd.ms-excel");
response.setContentLength(bytes.length);
ServletOutputStream ouputStream = response.getOutputStream();
ouputStream.write(bytes,0,bytes.length);
ouputStream.flush();
ouputStream.close();
}else{
out.print("bytes were null!");
}
conn.close();
}catch(JRException ex){
out.print("Jasper Output Error:"+ex.getMessage());
}
%>
}
总结 ireport可以显示图表,饼图,曲线图等,也可以显示符合报表
JasperReports介绍:
使用JasperReports生成报表是非常简单的,仅仅使用net.sf.jasperreports.engine包中的几个类即可完成报表的生成、预览、打印、导出等各个功能。
1. net.sf.jasperreports.engine.JasperCompileManager类。
使用这个类的几个静态方法即可完成对报表的编译工作(具体参见api文档)
编译完成后可以JasperCompileManager有两种处理方式:
1> 返回一个JasperReport对象
2> 在.jrxml文件所在的目录生成一个.jasper文件
这两种方式是由程序员自己选择的。不过我比较倾向使用.jasper文件,毕竟报表的结构不是每天都在改动,所以每次重新编译报表并不是很划算。
2. net.sf.jasperreports.engine.JasperFillManager类
这个类的作用是用数据填充报表。它可以使用JasperReport对象也可以使用。jasper文件做为报表模板。
它同样有2中处理方式:
1> 返回一个JsaperPrint对象。
2> 在.jasper文件所在目录生成一个.jrprint文件
这个类使用net.sf.jasperreports.engine.JRDataSource接口的实现做为数据源。任何实现了JRDataSource的类均可做为数据源使用
在net.sf.jasperreports.engine.data包中定义了一些数据源,可根据自己的需要选择。这里我使用的是JRTableModelDataSource做为
数据源(因为我的报表还要显示在Table中)。
3. net.sf.jasperreports.engine.JasperPrintManager和net.sf.jasperreports.engine.JasperExportManager
者两个类的作用是打印、导出报表
他们使用 JasperPrint 和 .jrprint文件做为输入。
可以根据自己的需要使用里面的方法。
例:
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.view.*;
public class CompileReport {
public static void main(String args[]) {
try {
//编译report.jrxml并在report.jrxml所在的目录中生成report.jasper文件
JasperCompileManager.compileReportToFile("report.jrxml");
//填充数据,这里使用的是JREmptyDataSource
JasperFillManager.fillReportToFile("report.jasper", null, new JREmptyDataSource(50));
//预览报表,false代表不是使用xml文件。
JasperViewer view = new JasperViewer("reports.jrprint", false);
view.pack();
view.setVisible(true);
}
catch (Exception e) {
e.printStackTrace()
}
}
}
http://www.heci.net 贺词网!]
JasperReports学习笔记
版本:jasperreports-0.6.7
学习资料来源: http://jasperreports.sourceforge.net
一、 需求(requirements)
JasperReports要用到的工具和类
1. JDK(java开发环境)
JDK 1.2.2 or higher
2. XML
JAXP 1.1 XML Parser(XML解析器)
Jakarta Commons Digester Component (version 1.1 or later)
http://jakarta.apache.org/commons/digester/
Jakarta Commons BeanUtils Component (version 1.1 or later)
http://jakarta.apache.org/commons/beanutils/
Jakarta Commons Collections Component (version 1.0 or later)
http://jakarta.apache.org/commons/collections/
Jakarta Commons Logging Component (version 1.0 or later)
http://jakarta.apache.org/commons/logging/
3. JDBC(连接数据库用)
JDBC 2.0 Driver
4. PDF(转换为PDF文件用到)
iText - Free Java-PDF library by Bruno Lowagie and Paulo Soares
(version 1.01 or later)
http://www.lowagie.com/iText/
5. XLS(转换为excel文件用)
Jakarta POI (version 2.0 or later)
http://jakarta.apache.org/poi/
二、快速了解(quick how to)
1. Main classes(主要的类)
用JasperReports 时,用到的主要类
net.sf.jasperreports.engine.JasperCompileManager
net.sf.jasperreports.engine.JasperFillManager
net.sf.jasperreports.engine.JasperPrintManager
net.sf.jasperreports.engine.JasperExportManager
这些类提供了很多静态方法,用来编译、填充、打印和导出报表。详细信息请参考JasperReports的javadoc文档。
net.sf.jasperreports.view.JasperViewer
此类用来预览生成的报表(generated reports.)。
net.sf.jasperreports.view.JasperDesignViewer
此类用来预览报表 设计 (view the report design)。
2. 编译报表设计Compiling a report design
xml文件定义报表设计(report design)。编译报表设计(report design)产生报表(generate reports)。网页 http://jasperreports.sourceforge.net/quick.how.to.html中介绍用net.sf.jasperreports.engine.JasperCompileManager类的静态方法compileReportXXX()来编译报表设计(report design)。但是JasperCompileManager不赞成使用此方法编译报表设计(report design),推荐使用JasperCompileManager的方法compileReportXXX()来代替。
编译报表设计(report design)时,jasperreports engine首先检查模板,确定是否一致,然后转换所有的报表表达式(report expressions),最后产生.jasper文件。 要想使编译工作尽可能灵活,你可以实现接口net.sf.jasperreports.engine.design.JRCompiler。
3.预览报表设计 Viewing a report design
使用net.sf.jasperreports.view.JasperDesignViewer的程序来预览。他的main()方法接受报表设计文件名(xml)或者编译后的.jasper文件。
4. 填充报表 Filling a report
编译报表设计(xml文件)得到报表文件(.jasper),再调用net.sf.jasperreports.engine.JasperFillManager类的方法fillReportXXX(),可以得到报表(JasperPrint)。
5. 预览报表 Viewing a report
Generated reports can be viewed using the net.sf.jasperreports.view.JasperViewer application.
In its main() method, it receives the name of the file which contains the report to view.
我没有测试成功。
6. Printing a report
Generated reports can be printed using the printReport(), printPage() or printPages() static methods exposed by the net.sf.jasperreports.engine.JasperPrintManager class.
7. Exporting to PDF, HTML, XLS, CSV or XML format
填充报表文件(.jasper文件)得到报表(JasperPrint)后,可以使用net.sf.jasperreports.engine.JasperExportManager类的方法exportReportXXX()导出为各种格式的文件PDF,HTML,XML。
After having filled a report, we can also export it in PDF, HTML or XML format using the exportReportXXX() methods of the net.sf.jasperreports.engine.JasperExportManager class.
三、JasperReports的工作流程:
根据上图的流程,JasperReports做报表有一下步骤:
1、 报表设计,可以用ireport可视化工具来实现,生成xml文件。完成后,可以直接到步骤3,直接编译xml文件。
2、 如果已经存在报表设计文件(xml文件),可以用net.sf.jasperreports.engine.xml.JRXmlLoader.load()方法载入报表设计,该方法返回JasperDesign对象,通过JasperDesign对象,可以修改报表设计,比如:添加、删除字段,添加、删除变量,添加、删除分组,等等。
3、 完成报表设计后,接下来就可以编译报设计,编译报表设计可以用类net.sf.jasperreports.engine.JasperCompileManager的compileReport()方法来实现,该方法可以编译xml文件或JasperDesign对象,产生JasperReport对象,JasperReport对象可序列化,能够保存为文件(通常是.jasper文件)。类net.sf.jasperreports.engine.JasperCompileManager还可以把报表转化为报表设计文件(xml文件)。得到JasperReport对象(可从.jasper文件实例化一个JasperReport对象)后,给报表填充数据产生JasperPrint对象。JasperPrint对象可序列化,保存为文件。有了JasperPrint对象后,可以打印、浏览、转换为其他格式的文件,如:PDF,HTML,XML,XLS,CSV等等,这些操作就是我们想得到的最终结果。尽管JasperPrintManager类可以导出为PDF,XML文件,但是不赞成使用JasperPrintManager类来导出,建议用JasperExportManager类来导出PDF,HTML,XML文件;要导出XLS和CSV文件,用 专业 的导出类net.sf.jasperreports.engine.export.JRXlsExporter类和net.sf.jasperreports.engine.export.JRCsvExporter类
导出为XLS的代码段:
JRXlsExporter exporter = new JRXlsExporter();//创建实例
//设计参数
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, strDestFile);
exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE);
exporter.exportReport();//导出
导出为CSV文件和XLS类似。
1 正确安装配置 java 的jdk
2 将ireport放到c:/ireport
3 将ant放到c:/ant(我用的是bea的ant路径是D:/bea/weblogic81/server/ant)
4 将jasperreports-1.2.0.jar 放置到当前classpath中(没有加,我使用的Ireport/lib下已经存在了)
5 将itext-1.3.1.jar放置到c:/ireport/lib(没有加,我使用的Ireport/lib下已经存在了)
6 修改ireport/ireport.bat文件,加入以下内容
set JAVA_HOME=C:/j2sdk1.4.2
set ANT_HOME=D:/bea/weblogic81/server/
set IREPORT_HOME=c:/ireport rem %ANT_HOME%/bin/ant javadocs %ANT_HOME%/bin/ant iReport
我修改的是:
set JAVA_HOME=C:/j2sdk1.4.2
set ANT_HOME=D:/bea/weblogic81/server/
set IREPORT_HOME=F:/backup/iReport-1.2.0 rem %ANT_HOME%/bin/ant javadocs %ANT_HOME%/bin/ant iReport
(不过对以上修改,感觉没有什么用处)
7 提供一个正常提供服务的数据库
现在高版本的ireport是不需要进行配置,可以直接使用的.
了解制作报表用的包
1 jasperreports-1.0.1.jar jasperreports是iReport的核心内容,jsperreport是一个 报表 制作程序,用它的规则制定一个xml文件,然后编译生成一个.jsper文件,这个.jsper文件是我们真正使用的,它很象.jsp文件,使用的是它编译后的servlet. ( http://jasperreports.sourceforge.net/)
2 itext-1.3.1.jar iText是一个开放源码的Java类库,是用来生成PDF文件的。如果要在生成的pdf文件显示中文等亚洲字符,还必须下载itext的亚洲字符包iTextAsian.jar ( http://itextdocs.lowagie.com/downloads/iTextAsian.jar)
3 jfreechart-1.0.0-rc1.jar jfreechart是一款免费的、功能强大的统计图生成工具,可以直接生成PNG,JPG等各式的文件。 ( http://www.jfree.org/jfreechart/)
4 jcommon-1.0.0-rc1.jar JCommon是一组有用的classes集合.它已经用在JFreeChart,JFreeReport与其它 项目 上. 这个类库包含了以下功能: 文本工具类(text utilities), 用来显示关于应用程序信息的用户界面类, 布局定制管理器, 一个日期选择面板, 序列化工具类, XML解析器支持类. ( http://www.jfree.org/jcommon/)
5 poi-2.0-final-20040126.jar Apache的Jakata项目的POI子项目,目标是处理ole2对象。目前比较成熟的是HSSF接口,处理MS Excel(97-2002)对象。它不象我们仅仅是用csv生成的没有格式的可以由Excel转换的东西,而是真正的Excel对象,你可以 控制 一些属性如sheet,cell等等。直接调用poi包的不是ireport,而是jasperreport。 ( http://www.apache.org/dyn/closer.cgi/jakarta/poi/)
使用介绍
1 启动:点击ireport/ireport.bat启动
2 修改语言环境:tools-option-general中language中更改-apply
3 创建报表 file-new document 输入名字-ok Portrait是纵向,Landscape是横向。
4 连接数据源 datasource-connection/datasource-new-connections porperties- 输入名字-选择jdbc Driver,jdbc url-输入username和password,-test测试通过表明数据源连接正确-save保存 (注意:必须保证数据库驱动在lib目录下)
5 基本域说明
title域用来放报表的总标题
pageHeaher域顾名思义页头
columnHeader域是用来放static text的,也就是不循环的部分。
detail域是用来放text field的,也就是循环部分。
pageFooter域是用来放本页的统计参数的。
summary域是用来放整个表的统计参数的。
可以直接调整每个域的长度,也可以通过Band properties来调整 (在我的项目中,只设置的title和detail,在title中显示报表的总标题和所有parameters字段,在detail中显示需要循环的列表字段)
6 在报表中添加字段static text edit-insert element -static text 鼠标拖拉添加在页面中双击或者右键properties在static text Tab 中输入字段名字,如果显示有乱码,font-font name中选择"中文GB2312" border 中可以设置表格边线样式
7 在报表中添加字段text field edit-insert element -text field 鼠标拖拉添加在页面中双击或者右键properties在text field 中输入字段名字, 样式如同$F{text_field_name},
f表示为field变量,是数据库中抽取出来的,你想在报表中显示的数据库内容,
p为parameter参数,是应用需要提供给报表的入口,比如想在报表被解释的时候提供where语句的条件值, 就 可以用 $P(parameterName)比如: select * from bugs where proname=$P{projectName} order by proname,modulename
v为变量(显示字体颜色为绿色,表示格式正确) border 中可以设置表格边线样式
8 调整报表布局鼠标拖动各个字段,拼接想要的报表布局,如果鼠标点击字段, 显示为红色,说明该字段跨越了两个域显示为绿色,说明两个字段叠加显示为蓝色,说明该字段位置正确
9 报表添加SQL查询语句 资料来源->报表查询(datasource-report query) 在Report SQL query里填写SQl语句。如果语句正确,在下面的field里就会显示正常的表字段。 (可以从显示的所有字段中选取想用做field的字段,点击ok后,自动添加为field动态字段)
10 为报表添加动态字段预览->报表字段(view-Fields) 新建一个字段,字段名字必须和报表中Fields中添加名字一直,同时必须是sql结果集中存在的. (把fields里的字段直接拖到报表上也行)
11 为SQL语句添加参数 预览->报表参数(view-parameters) 在parameters里新增一个参数 paratemeter name 是参数名,在SQL语句里写成"$P{参数名}" paratemeter class type里选择参数类型。 注意:如果是int型的数据,最好在报表字段里将该字段的Class type改成java.lang.String型的。 另外一种办法,不管该字段原来是什么数据类型,直接在paratemeter class type里选择java.lang.String类型, 后在Default value expression 填写"Integer.toString(整数)"。
12 添加报表变量 预览->报表变量 $V{变量名}(没有用到过!)
13 处理字体 选中字段->右键->properties->font(双击也可以) Report font 选择全局的字体(仅限于该报表) Font name 选择在ireport里面显示的字体 Pdf font name 选择在pdf里面显示的字体 Rotation 选择内容是否旋转(很有用的选项) PDF Encoding 中文要用UniGB-UCS2-H,外部字体要选Identity-H
14 设定该报表的全局字体 预览->报表字型(view-font)
15 编译jrxml 建立->编译 (build-compile) 编译后生成一个后缀名为jasper的binary文件,可以直接给程序调用。
web项目应用
1 jsp输出PDF报表
需要放到项目里的包 itext-1.3.1.jar iTextAsian.jar jasperreports-1.0.1.jar jsp
输出PDF的例子
{
<%@ page import="java.sql.*" %>
<%@ page import="java.util.*" %>
<%@ page import="java.io.*" %>
<%@ page import="net.sf.jasperreports.engine.JasperFillManager"%>
<%@ page import="net.sf.jasperreports.engine.JasperPrint"%>
<%@ page import="net.sf.jasperreports.engine.JRException"%>
<%@ page import="net.sf.jasperreports.engine.JasperRunManager"%>
<%
String rowid = "1";//初始化变量
Connection conn= DriverManager.getConnection("proxool.test");//从数据源连接数据库
//装载jasper文件application
File exe_rpt = new File(application.getRealPath("/reports/test.jasper"));
//rowid就是iReport的变量$P{rowid}的名称
Map parameters = new HashMap();
parameters.put("rowid",rowid);
try{
// fill
JasperPrint jasperPrint = JasperFillManager.fillReport(exe_rpt.getPath(),parameters,conn);
// 生成pdf
byte[] bytes = JasperRunManager.runReportToPdf(exe_rpt.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();
conn.close();
}catch(JRException ex){
out.print("Jasper Output Error:"+ex.getMessage());
}
%>
}
jsp输出EXCEL报表
需要放到项目里的包 jasperreports-1.0.1.jar poi-2.0-final-20040126.jar
输出excel要注意的:
(1) 输出excel报表必须fields的边界刚好填充满整个页面,不然会有大量的空白出现。
(2) 删除记录最下面的空行需要加上参数 exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,Boolean.TRUE);
(3) 删除多余的ColumnHeader需要加上参数 exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,Boolean.FALSE);
(4) 在ireport里给fields加上border,那输出的excel就会有很黑的边框,跟excel默认的灰度边框就会很不协调。但是如果不加border,在输出的excel里就不会显示每个表格的边框。
解决 方法 是: 第一步 在选中字段->右键->properties->Common->Transparent 打上勾。 第二步 在输出的jsp页面加上参数 exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND,Boolean.FALSE);
2 jsp输出EXCEL的例子
{
<%@ page import="java.sql.*" %>
<%@ page import="java.util.*" %>
<%@ page import="java.io.*" %>
<%@ page import="net.sf.jasperreports.engine.JasperFillManager" %>
<%@ page import="net.sf.jasperreports.engine.JasperPrint"%>
<%@ page import="net.sf.jasperreports.engine.JRException"%>
<%@ page import="net.sf.jasperreports.engine.JRExporterParameter"%>//excel
<%@ page import="net.sf.jasperreports.engine.export.JRXlsExporterParameter"%>//excel
<%@ page import="net.sf.jasperreports.engine.export.JRXlsExporter"%>//excel
<%
String rowid = "1";
Connection conn= DriverManager.getConnection("proxool.test");
//装载jasper文件application
File exe_rpt = new File(application.getRealPath("/excel/test_excel.jasper"));
//rowid就是iReport的变量$P{rowid}的名称
Map parameters = new HashMap();
parameters.put("rowid",rowid);
try{
// fill
JasperPrint jasperPrint = JasperFillManager.fillReport(exe_rpt.getPath(),parameters,conn);
// excel输出
ByteArrayOutputStream oStream = new ByteArrayOutputStream();
JRXlsExporter exporter = new JRXlsExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, oStream);
exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,Boolean.TRUE); // 删除记录最下面的空行
exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,Boolean.FALSE);// 删除多余的ColumnHeader
exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND,Boolean.FALSE);// 显示边框
exporter.exportReport();
byte[] bytes = oStream.toByteArray();
if(bytes != null && bytes.length > 0) {
response.reset();
response.setContentType("application/vnd.ms-excel");
response.setContentLength(bytes.length);
ServletOutputStream ouputStream = response.getOutputStream();
ouputStream.write(bytes,0,bytes.length);
ouputStream.flush();
ouputStream.close();
}else{
out.print("bytes were null!");
}
conn.close();
}catch(JRException ex){
out.print("Jasper Output Error:"+ex.getMessage());
}
%>
}
总结 ireport可以显示图表,饼图,曲线图等,也可以显示符合报表
JasperReports介绍:
使用JasperReports生成报表是非常简单的,仅仅使用net.sf.jasperreports.engine包中的几个类即可完成报表的生成、预览、打印、导出等各个功能。
1. net.sf.jasperreports.engine.JasperCompileManager类。
使用这个类的几个静态方法即可完成对报表的编译工作(具体参见api文档)
编译完成后可以JasperCompileManager有两种处理方式:
1> 返回一个JasperReport对象
2> 在.jrxml文件所在的目录生成一个.jasper文件
这两种方式是由程序员自己选择的。不过我比较倾向使用.jasper文件,毕竟报表的结构不是每天都在改动,所以每次重新编译报表并不是很划算。
2. net.sf.jasperreports.engine.JasperFillManager类
这个类的作用是用数据填充报表。它可以使用JasperReport对象也可以使用。jasper文件做为报表模板。
它同样有2中处理方式:
1> 返回一个JsaperPrint对象。
2> 在.jasper文件所在目录生成一个.jrprint文件
这个类使用net.sf.jasperreports.engine.JRDataSource接口的实现做为数据源。任何实现了JRDataSource的类均可做为数据源使用
在net.sf.jasperreports.engine.data包中定义了一些数据源,可根据自己的需要选择。这里我使用的是JRTableModelDataSource做为
数据源(因为我的报表还要显示在Table中)。
3. net.sf.jasperreports.engine.JasperPrintManager和net.sf.jasperreports.engine.JasperExportManager
者两个类的作用是打印、导出报表
他们使用 JasperPrint 和 .jrprint文件做为输入。
可以根据自己的需要使用里面的方法。
例:
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.view.*;
public class CompileReport {
public static void main(String args[]) {
try {
//编译report.jrxml并在report.jrxml所在的目录中生成report.jasper文件
JasperCompileManager.compileReportToFile("report.jrxml");
//填充数据,这里使用的是JREmptyDataSource
JasperFillManager.fillReportToFile("report.jasper", null, new JREmptyDataSource(50));
//预览报表,false代表不是使用xml文件。
JasperViewer view = new JasperViewer("reports.jrprint", false);
view.pack();
view.setVisible(true);
}
catch (Exception e) {
e.printStackTrace()
}
}
}
http://www.heci.net 贺词网!]
JasperReports学习笔记
版本:jasperreports-0.6.7
学习资料来源: http://jasperreports.sourceforge.net
一、 需求(requirements)
JasperReports要用到的工具和类
1. JDK(java开发环境)
JDK 1.2.2 or higher
2. XML
JAXP 1.1 XML Parser(XML解析器)
Jakarta Commons Digester Component (version 1.1 or later)
http://jakarta.apache.org/commons/digester/
Jakarta Commons BeanUtils Component (version 1.1 or later)
http://jakarta.apache.org/commons/beanutils/
Jakarta Commons Collections Component (version 1.0 or later)
http://jakarta.apache.org/commons/collections/
Jakarta Commons Logging Component (version 1.0 or later)
http://jakarta.apache.org/commons/logging/
3. JDBC(连接数据库用)
JDBC 2.0 Driver
4. PDF(转换为PDF文件用到)
iText - Free Java-PDF library by Bruno Lowagie and Paulo Soares
(version 1.01 or later)
http://www.lowagie.com/iText/
5. XLS(转换为excel文件用)
Jakarta POI (version 2.0 or later)
http://jakarta.apache.org/poi/
二、快速了解(quick how to)
1. Main classes(主要的类)
用JasperReports 时,用到的主要类
net.sf.jasperreports.engine.JasperCompileManager
net.sf.jasperreports.engine.JasperFillManager
net.sf.jasperreports.engine.JasperPrintManager
net.sf.jasperreports.engine.JasperExportManager
这些类提供了很多静态方法,用来编译、填充、打印和导出报表。详细信息请参考JasperReports的javadoc文档。
net.sf.jasperreports.view.JasperViewer
此类用来预览生成的报表(generated reports.)。
net.sf.jasperreports.view.JasperDesignViewer
此类用来预览报表 设计 (view the report design)。
2. 编译报表设计Compiling a report design
xml文件定义报表设计(report design)。编译报表设计(report design)产生报表(generate reports)。网页 http://jasperreports.sourceforge.net/quick.how.to.html中介绍用net.sf.jasperreports.engine.JasperCompileManager类的静态方法compileReportXXX()来编译报表设计(report design)。但是JasperCompileManager不赞成使用此方法编译报表设计(report design),推荐使用JasperCompileManager的方法compileReportXXX()来代替。
编译报表设计(report design)时,jasperreports engine首先检查模板,确定是否一致,然后转换所有的报表表达式(report expressions),最后产生.jasper文件。 要想使编译工作尽可能灵活,你可以实现接口net.sf.jasperreports.engine.design.JRCompiler。
3.预览报表设计 Viewing a report design
使用net.sf.jasperreports.view.JasperDesignViewer的程序来预览。他的main()方法接受报表设计文件名(xml)或者编译后的.jasper文件。
4. 填充报表 Filling a report
编译报表设计(xml文件)得到报表文件(.jasper),再调用net.sf.jasperreports.engine.JasperFillManager类的方法fillReportXXX(),可以得到报表(JasperPrint)。
5. 预览报表 Viewing a report
Generated reports can be viewed using the net.sf.jasperreports.view.JasperViewer application.
In its main() method, it receives the name of the file which contains the report to view.
我没有测试成功。
6. Printing a report
Generated reports can be printed using the printReport(), printPage() or printPages() static methods exposed by the net.sf.jasperreports.engine.JasperPrintManager class.
7. Exporting to PDF, HTML, XLS, CSV or XML format
填充报表文件(.jasper文件)得到报表(JasperPrint)后,可以使用net.sf.jasperreports.engine.JasperExportManager类的方法exportReportXXX()导出为各种格式的文件PDF,HTML,XML。
After having filled a report, we can also export it in PDF, HTML or XML format using the exportReportXXX() methods of the net.sf.jasperreports.engine.JasperExportManager class.
三、JasperReports的工作流程:
根据上图的流程,JasperReports做报表有一下步骤:
1、 报表设计,可以用ireport可视化工具来实现,生成xml文件。完成后,可以直接到步骤3,直接编译xml文件。
2、 如果已经存在报表设计文件(xml文件),可以用net.sf.jasperreports.engine.xml.JRXmlLoader.load()方法载入报表设计,该方法返回JasperDesign对象,通过JasperDesign对象,可以修改报表设计,比如:添加、删除字段,添加、删除变量,添加、删除分组,等等。
3、 完成报表设计后,接下来就可以编译报设计,编译报表设计可以用类net.sf.jasperreports.engine.JasperCompileManager的compileReport()方法来实现,该方法可以编译xml文件或JasperDesign对象,产生JasperReport对象,JasperReport对象可序列化,能够保存为文件(通常是.jasper文件)。类net.sf.jasperreports.engine.JasperCompileManager还可以把报表转化为报表设计文件(xml文件)。得到JasperReport对象(可从.jasper文件实例化一个JasperReport对象)后,给报表填充数据产生JasperPrint对象。JasperPrint对象可序列化,保存为文件。有了JasperPrint对象后,可以打印、浏览、转换为其他格式的文件,如:PDF,HTML,XML,XLS,CSV等等,这些操作就是我们想得到的最终结果。尽管JasperPrintManager类可以导出为PDF,XML文件,但是不赞成使用JasperPrintManager类来导出,建议用JasperExportManager类来导出PDF,HTML,XML文件;要导出XLS和CSV文件,用 专业 的导出类net.sf.jasperreports.engine.export.JRXlsExporter类和net.sf.jasperreports.engine.export.JRCsvExporter类
导出为XLS的代码段:
JRXlsExporter exporter = new JRXlsExporter();//创建实例
//设计参数
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, strDestFile);
exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE);
exporter.exportReport();//导出
导出为CSV文件和XLS类似。