Jasperreport基本介绍(Jasperreport与Ireport介绍)
Jasperreport基本介绍
Jasperreport与Ireport介绍
Jasperreport是报表打印工具,支持pdf、csv多种格式的报表打印。
JasperReport是一个开源的工具包,将JasperReport包加入到项目的classpath中即可开始使用JasperReport包了,从java程序中通过调用包中的类对jrxml文件进行操作,可以完成报表的编译、显示、输出等工作;
Jasperreport的报表生成过程,如下图。
如上图所示。报表模板有两种制作方式:
1)利用ireport图形编辑工具,iReport是报表编辑图形工具,编辑完成后输出jrxml文件(XML格式), 生成jasper文件(以.jasper结尾);
2)直接利用java代码编译生成jasper文件(以.jasper结尾)。
最终要使用的是编译后的*.jasper文件。
Jasperreport支持多种数据源,包括xml、数据库、JavaBean等多种数据源。
Jasperreport基本类
l net.sf.jasperreports.engine.JasperCompileManager类。
使用这个类的几个静态方法即可完成对报表的编译工作(具体参见api文档)
编译完成后可以JasperCompileManager有两种处理方式:
1> 返回一个JasperReport对象
2> 在.jrxml文件所在的目录生成一个.jasper文件
这两种方式是由程序员自己选择的。不过我比较倾向使用.jasper文件,毕竟报表的结构不是每天都在改动,所以每次重新编译报表并不是很划算。
l 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做为
l 3. net.sf.jasperreports.engine.JasperPrintManager和
net.sf.jasperreports.engine.JasperExportManager这两个类的作用是打印、导出报表他们使用 JasperPrint 和 .jrprint文件做为输入。
Jasperreport实例演示
少说废话,下面我们就进行一些基本的演示。在下才疏学浅,在调查中只做了三种尝试:1)利用ireport进行模板设计,数据源采用xml文件;
2)利用ireport设计模板,导入jfreechat对象;
3)使用java代码设计模板,数据源为对象数组。
下面我们逐一进行讲解。OK,let’s go!!!!
Ireport设计模板,xml数据源
1) 安装ireport。
直接点击Windows版本ireport安装文件,安装文件中已经包含了jasperreport组件,这里不做表述,有问题问百度!
2) 打开ireport
Ireport 3.7.4用户界面如图所示。
客官您瞧见,用户界面上的“Quick start”没?按照图中表示的1、2、3去做,就基本能搞清楚ireport是什么道道!
3) 添加数据源
点击标号①,界面如下:
哇塞,这么多数据源,看来真的是很好很强大耶。我们选择“xml file datasource”,点击next,
按照上图填入数据源名称、以及数据源xml文件,注意一定要选择“Use the report Xpath expression when filling the report”.点击“save” 即可,在下图标记处会出现相应的生成结果。
现在让我们先查看一下,刚刚添加xml数据源的具体结构:
数据源准备好了,可以开始模板创建了。
4) 创建模板
在上图中点击“②”,出现下图。
点击“Launch report wizard”,如下图:
输入报表名以及保存路径,点击“下一步”
在“Connections/Data sources”中选择你需要的数据源。接下来就直接点击“下一步”,直到完成。
点击完成后,进入模板元素设计页面。
图中,左边标记为页面监视器(report inspector),右边为组件工具栏。若客官您在使用的过程中,不小心关闭了这些窗口,您可以在菜单栏“窗口”中找到,点击之后,该窗口就会出现了。
5) 添加元素
在组件工具栏中选择组件,直接拖拽到模板中。
点击图中红色标记,进入如下图:
将图中标记的“Customers”拖拽到下方的标记处,此处的作用就是要将数据源中的数据字段添加要ireport中,以便下一步为刚刚建立的“Field”元素指定,查询语句。如下图。
点击OK即可。
再右击Field元素,点击“Edit Expression”,如图:
将Field括号内的改成您需要的字段如“CompanyName”。点击“Apply”
做到这一步,您可能觉得“应该该做了都做完了,可以进行预览了!”,其实我也这么想的,也这么做的,可是,预览报错,经过研究,我还是少做了一步,而这一步至关重要,就是我们没有选择xml文件中的数据list节点。
您必须要按照如上图所做,输入Query语句。
好了,这下我们就可以预览了。
6) 预览报表
点击“preview”按钮就成,让我们看看效果吧:
呵呵,丑是丑了点,但是这是我们头一回用ireport,还是很有成就感的。
ireport设计模板,导入jfreechat对象
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使用。
在介绍导入jfreechat对象之前,我们现在讨论一个东西,这个东西很有用,叫scriptlet---脚本语言,听过吧,我们把生成jfreechat对象的java代码放在报表模板的脚本里,在编译模板时,连同脚本一起编译进去。
jasperReport也是支持scriptlet的哦,先分析一下JasperReport的API吧!在填充报表时scriplet是一个非常有力的工具,
JRAbstractScriptlet.java位于net.sf.jasperreports.engine包下是一个抽象类
beforeReportInit()
afterReportInit()
beforePageInit()
afterPageInit()
beforeColumnInit()
afterColumnInit()
beforeGroupInit(String groujpame)
afterGroupInit(String groujpame)
看看这些名字就知道你能完成那些功能,这几个方法是要求我们实现的,jasperReport给我们提供了一个实现类JRDefaultScriptlet.java,默认的空实现了上面几个方法,它只是很便利的为我们提供了所需的八个方法的空实现。我们写自己的scriptlet时需要继承JRDefaultScriptlet.java这个类实现自己的相应的功能即可。
好了,我们现在就来为模板添加scriptlet
1) 在模板中,选中整个模板,如图:
双击右边的属性窗口,将其中的内容设置为如图所示的内容:
将“scriptlet class”设为您即将要制作的java类,这里我的java类名叫scriplet.ScriptletDemo。
其内部代码如下:
package scriplet;
import net.sf.jasperreports.engine.JRDefaultScriptlet;
import net.sf.jasperreports.engine.JRScriptletException;
import net.sf.jasperreports.renderers.JFreeChartRenderer;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.PiePlot3D;
import org.jfree.data.general.DefaultPieDataset;
public class ScriptletDemo extends JRDefaultScriptlet {
public void afterColumnInit() throws JRScriptletException {
System.out.println("**************************************afterColumnInit()**************************************");
}
@Override
public void afterDetailEval() throws JRScriptletException {
System.out.println("**************************************afterDetailEval()**************************************");
}
@Override
public void afterGroupInit(String groujpame) throws JRScriptletException {
System.out.println("**************************************afterDetailEval()**************************************");
}
@Override
public void afterPageInit() throws JRScriptletException {
System.out.println("**************************************afterPageInit()**************************************");
}
@Override
public void afterReportInit() throws JRScriptletException {
System.out.println("**************************************afterReportInit() begin**************************************");
//create pie chart dataset
DefaultPieDataset dateset = new DefaultPieDataset();
//set dataset value
dateset.setValue("Chinese", 108);
dateset.setValue("Math", 110);
dateset.setValue("English", 74);
dateset.setValue("Science Department", 226);
/**//*
* create jfreeChart object
* the first parameter is pie chart title
* the secend parameter is dataset of pie chart
* the three parameter is boolean value,create chart note
* the four parameter is boolean value,it's a tooltip of move mouse on
* configure chart to generate URLs,It's get a PiePlot3D object
*
*/
JFreeChart freeChart = ChartFactory.createPieChart3D("Report Pie Chart", dateset, true, false, false);
PiePlot pieplot = (PiePlot) freeChart.getPlot();
pieplot.setNoDataMessage("No data to display");
// set variable "jfreeChart" value
this.setVariableValue("jfreechart", new JFreeChartRenderer(freeChart));
System.out.println("**************************************afterReportInit() end**************************************");
}
@Override
public void beforeColumnInit() throws JRScriptletException {
System.out.println("**************************************beforeColumnInit()**************************************");
}
@Override
public void beforeDetailEval() throws JRScriptletException {
System.out.println("**************************************beforeDetailEval()**************************************");
}
@Override
public void beforeGroupInit(String groujpame) throws JRScriptletException {
System.out.println("**************************************beforeGroupInit()**************************************");
}
@Override
public void beforePageInit() throws JRScriptletException {
System.out.println("**************************************beforePageInit()**************************************");
}
@Override
public void beforeReportInit() throws JRScriptletException {
System.out.println("**************************************beforeReportInit()**************************************");
}
public String showInfor() throws JRScriptletException {
return "the is scriptlet scriptlet scriptlet the,sscriptlet report the is ascriptlet report this is a scriptlet report this is a scriptlet report";
}
}
2) 新建变量variable
如图在选中“Variable”,右击,点击“添加variable”
将新建的variable属性设置如下图所示:
其中variable class设为“net.sf.jasperreports.engine.JRRenderable”,同志您可能要迷惑了,该选项的下拉菜单中没有该选项啊,是的,的确没有,但是你可以粘贴进去。
3) 添加图像,直接将组件中的“image”对象拖拽进来,拖拽的时候,会有图片选择框,这个没有关系,你可以选择一个您喜欢的图片,也可以直接取消,只不过是一个标志,在模板中出现如下画面:
是不是很丑呢,嘿嘿,我也觉得丑。
好了,下面来设置图片的属性,这个才是关键的。属性如下图:
重要的是image expression以及expression class,分别设为“$V{jfreechart}”、“net.sf.jasperreports.engine.JRRenderable”
至此模板设置成功。
4) 代码测试
将上面设计好的模板保存为“E:/ireport/jfreechat.jrxml”
写一段java代码测试一下:
package test;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.HashMap;
import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.base.JRBaseVariable;
import net.sf.jasperreports.view.JasperViewer;
public class JChartReportMain {
/**
* Method name: main <BR>
* Description: main <BR>
* Remark: <BR>
* @param args void<BR>
*/
public static void main(String[] args) {
String path = "
File file = new File(path);
InputStream in;
try {
HashMap<String, String> parameters = new HashMap<String, String>();
parameters.put("ReportTitle", "LAOSHULIN");
in = new FileInputStream(file);
JasperReport jasperReport = JasperCompileManager.compileReport(in);
for(int i = 0; i<jasperReport.getVariables().length;i++ ){
JRBaseVariable jb = (JRBaseVariable)jasperReport.getVariables()[i];
System.out.println(jb.getValueClassName() + jb.getName());
}
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,
parameters, new JREmptyDataSource());
JasperViewer viewer = new JasperViewer(jasperPrint);
viewer.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果如图:
你看多棒啊,是不是觉得自己很牛叉啊!
java代码设计模板,数据源为对象数组。
用java实现模板设计,我们就直接粘贴代码,先要将jasperreport相关的jar包导入进来:
我的代码结构如图所示:
WebappDataSource.java
/*
* JasperReports - Free Java Reporting Library.
* Copyright (C) 2001 - 2009 Jaspersoft Corporation. All rights reserved.
* http://www.jaspersoft.com
*
* Unless you have purchased a commercial license agreement from Jaspersoft,
* the following license terms apply:
*
* This program is part of JasperReports.
*
* JasperReports is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* JasperReports is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with JasperReports. If not, see <http://www.gnu.org/licenses/>.
*/
package datasource;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRField;
/**
* @author Teodor Danciu (teodord@users.sourceforge.net)
* @version $Id: WebappDataSource.java 3031 2009-08-27 11:14:57Z teodord $
*/
public class WebappDataSource implements JRDataSource
{
/**
*
*/
private Object[][] data =
{
{"Berne", new Integer(22), "Bill", "250 - 20th Ave."},
{"Berne", new Integer(9), "James Schneider", "277 Seventh Av."},
{"Boston", new Integer(32), "Michael Ott", "339 College Av."},
{"Boston", new Integer(23), "Julia Heiniger", "358 College Av."},
{"Chicago", new Integer(39), "Mary Karsen", "202 College Av."},
{"Chicago", new Integer(35), "George Karsen", "412 College Av."},
{"Chicago", new Integer(11), "Julia White", "412 Upland Pl."},
{"Dallas", new Integer(47), "Janet Fuller", "445 Upland Pl."},
{"Dallas", new Integer(43), "Susanne Smith", "2 Upland Pl."},
{"Dallas", new Integer(40), "Susanne Miller", "440 - 20th Ave."},
{"Dallas", new Integer(36), "John Steel", "276 Upland Pl."},
{"Dallas", new Integer(37), "Michael Clancy", "19 Seventh Av."},
{"Dallas", new Integer(19), "Susanne Heiniger", "86 - 20th Ave."},
{"Dallas", new Integer(10), "Anne Fuller", "135 Upland Pl."},
{"Dallas", new Integer(4), "Sylvia Ringer", "365 College Av."},
{"Dallas", new Integer(0), "Laura Steel", "429 Seventh Av."},
{"Lyon", new Integer(38), "Andrew Heiniger", "347 College Av."},
{"Lyon", new Integer(28), "Susanne White", "74 - 20th Ave."},
{"Lyon", new Integer(17), "Laura Ott", "443 Seventh Av."},
{"Lyon", new Integer(2), "Anne Miller", "20 Upland Pl."},
{"New York", new Integer(46), "Andrew May", "172 Seventh Av."},
{"New York", new Integer(44), "Sylvia Ott", "361 College Av."},
{"New York", new Integer(41), "Bill King", "546 College Av."},
{"Oslo", new Integer(45), "Janet May", "396 Seventh Av."},
{"Oslo", new Integer(42), "Robert Ott", "503 Seventh Av."},
{"Paris", new Integer(25), "Sylvia Steel", "269 College Av."},
{"Paris", new Integer(18), "Sylvia Fuller", "158 - 20th Ave."},
{"Paris", new Integer(5), "Laura Miller", "294 Seventh Av."},
{"San Francisco", new Integer(48), "Robert White", "549 Seventh Av."},
{"San Francisco", new Integer(7), "James Peterson", "231 Upland Pl."}
};
private int index = -1;
/**
*
*/
public WebappDataSource()
{
}
/**
*
*/
public boolean next() throws JRException
{
index++;
return (index < data.length);
}
/**
*
*/
public Object getFieldValue(JRField field) throws JRException
{
Object value = null;
String fieldName = field.getName();
if ("city".equals(fieldName))
{
value = data[index][0];
}
else if ("ID".equals(fieldName))
{
value = data[index][1];
}
else if ("name".equals(fieldName))
{
value = data[index][2];
}
else if ("address".equals(fieldName))
{
value = data[index][3];
}
return value;
}
}
next() 实现了 JRDataSource 中的方法.判断是否还有下一个.
getFieldValue(JRField field) 实现了JRDataSource 中的方法. field 是对应报表中的要填充的字段的名称.
模板设计代码,java实现模板时,要贯彻一个思想就设计思路要与XML模板中组成结构一致,这也是我的心得体会之一。
StaticText.java
package test;
import java.io.File;
import java.util.HashMap;
import net.sf.jasperreports.engine.JRAlignment;
import net.sf.jasperreports.engine.JRElement;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.design.JRDesignBand;
import net.sf.jasperreports.engine.design.JRDesignExpression;
import net.sf.jasperreports.engine.design.JRDesignField;
import net.sf.jasperreports.engine.design.JRDesignParameter;
import net.sf.jasperreports.engine.design.JRDesignReportFont;
import net.sf.jasperreports.engine.design.JRDesignStyle;
import net.sf.jasperreports.engine.design.JRDesignTextField;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.view.JasperDesignViewer;
import net.sf.jasperreports.view.JasperViewer;
import datasource.WebappDataSource;
public class StaticText {
JRDesignReportFont font1 = new JRDesignReportFont();
// TODO Auto-generated method stub
/**
* Method name: main <BR>
* Description: main <BR>
* Remark: <BR>
* @param args void<BR>
*/
public static void main(String[] args) {
JRDesignReportFont font1 = new JRDesignReportFont();
font1.setFontSize(12);
try {
// JRDesignStaticText text1=ReportUtil.getStaticText(
// 110,0,400,22,null,JRTextElement.TEXT_ALIGN_CENTER,font1,"city");
// JRDesignStaticText text2=ReportUtil.getStaticText(
// 110,0,400,22,null,JRTextElement.TEXT_ALIGN_CENTER,font1,"name");
// JRDesignStaticText text3=ReportUtil.getStaticText(
// 110,0,400,22,null,JRTextElement.TEXT_ALIGN_CENTER,font1,"address");
JasperDesign jasperDesign = new JasperDesign();
jasperDesign.setName("NoXmlDesignReport");
jasperDesign.setPageWidth(595);
jasperDesign.setPageHeight(842);
jasperDesign.setColumnWidth(515);
jasperDesign.setColumnSpacing(0);
jasperDesign.setLeftMargin(40);
jasperDesign.setRightMargin(40);
jasperDesign.setTopMargin(50);
jasperDesign.setBottomMargin(50);
JRDesignStyle normalStyle = new JRDesignStyle();
normalStyle.setName("Arial_Normal");
normalStyle.setDefault(true);
normalStyle.setFontName("Arial");
normalStyle.setFontSize(12);
normalStyle.setPdfFontName("Helvetica");
normalStyle.setPdfEncoding("Cp1252");
normalStyle.setPdfEmbedded(false);
jasperDesign.addStyle(normalStyle);
// JRDesignStyle boldStyle = new JRDesignStyle();
// boldStyle.setName("Arial_Bold");
// boldStyle.setFontName("Arial");
// boldStyle.setFontSize(12);
// boldStyle.setBold(true);
// boldStyle.setPdfFontName("Helvetica-Bold");
// boldStyle.setPdfEncoding("Cp1252");
// boldStyle.setPdfEmbedded(false);
// jasperDesign.addStyle(boldStyle);
//
// JRDesignStyle italicStyle = new JRDesignStyle();
// italicStyle.setName("Arial_Italic");
// italicStyle.setFontName("Arial");
// italicStyle.setFontSize(12);
// italicStyle.setItalic(true);
// italicStyle.setPdfFontName("Helvetica-Oblique");
// italicStyle.setPdfEncoding("Cp1252");
// italicStyle.setPdfEmbedded(false);
// jasperDesign.addStyle(italicStyle);
JRDesignParameter parameter = new JRDesignParameter();
parameter.setName("ReportTitle");
parameter.setValueClass(java.lang.String.class);
jasperDesign.addParameter(parameter);
// Fields
JRDesignField field = new JRDesignField();
field.setName("city");
field.setValueClass(java.lang.String.class);
jasperDesign.addField(field);
field = new JRDesignField();
field.setName("ID");
field.setValueClass(java.lang.Integer.class);
jasperDesign.addField(field);
field = new JRDesignField();
field.setName("name");
field.setValueClass(java.lang.String.class);
jasperDesign.addField(field);
field = new JRDesignField();
field.setName("address");
field.setValueClass(java.lang.String.class);
jasperDesign.addField(field);
JRDesignBand band = null;
JRDesignTextField textField = null;
JRDesignExpression expression = null;
band = new JRDesignBand();
band.setHeight(20);
textField = new JRDesignTextField();
textField.setX(5);
textField.setY(4);
textField.setWidth(100);
textField.setHeight(15);
textField.setHorizontalAlignment(JRAlignment.HORIZONTAL_ALIGN_RIGHT);
textField.setStyle(normalStyle);
expression = new JRDesignExpression();
expression.setValueClass(java.lang.String.class);
expression.setText("$F{city}");
textField.setExpression(expression);
band.addElement(textField);
textField = new JRDesignTextField();
textField.setStretchWithOverflow(true);
textField.setX(120);
textField.setY(4);
textField.setWidth(100);
textField.setHeight(15);
textField.setPositionType(JRElement.POSITION_TYPE_FLOAT);
textField.setStyle(normalStyle);
expression = new JRDesignExpression();
expression.setValueClass(java.lang.Integer.class);
expression.setText("$F{ID}");
textField.setExpression(expression);
band.addElement(textField);
textField = new JRDesignTextField();
textField.setStretchWithOverflow(true);
textField.setX(220);
textField.setY(4);
textField.setWidth(100);
textField.setHeight(15);
textField.setPositionType(JRElement.POSITION_TYPE_FLOAT);
textField.setStyle(normalStyle);
expression = new JRDesignExpression();
expression.setValueClass(java.lang.String.class);
expression.setText("$F{name}");
textField.setExpression(expression);
band.addElement(textField);
textField = new JRDesignTextField();
textField.setStretchWithOverflow(true);
textField.setX(400);
textField.setY(4);
textField.setWidth(100);
textField.setHeight(15);
textField.setPositionType(JRElement.POSITION_TYPE_FLOAT);
textField.setStyle(normalStyle);
expression = new JRDesignExpression();
expression.setValueClass(java.lang.String.class);
expression.setText("$F{address}");
textField.setExpression(expression);
band.addElement(textField);
jasperDesign.setDetail(band);
HashMap<String, String> titleParameters = new HashMap<String, String>();
titleParameters.put("ReportTitle", "helloworld");
File reportFile= new File("E:/billin.jasper");
JasperCompileManager.compileReportToFile(jasperDesign,reportFile.getPath());
JasperReport jasperReport=(JasperReport)JRLoader.loadObject(reportFile.getPath());
JasperPrint jasperPrint=JasperFillManager.fillReport( jasperReport,titleParameters,new WebappDataSource());
System.out.println("--------"+jasperPrint.getName());
JasperViewer viewer = new JasperViewer(jasperPrint);
viewer.setTitle("");
viewer.setVisible(true);
// JasperDesignViewer viewer = new JasperDesignViewer(jasperReport);
// viewer.setVisible(true);
} catch (JRException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
下面就可以运行,查看报表结果:
关于jasperreport的sample
1)运行sample之前需要安装ant服务器
2)进入到某个sample目录中,输入ant,之后再输入ant view
3)有些sample需要运行sample自带的数据,则在hsqldb目录中,输入ant runServer命令启动数据库,再到sample目录中,输入ant,之后再输入ant view。