Jasperreport 使用

johnny_56 贡献于2012-03-20

作者 User  创建于2010-08-18 01:44:00   修改者User  修改于2010-08-18 06:35:00字数18466

文档摘要:Jasperreport是报表打印工具,支持pdf、csv多种格式的报表打印。 JasperReport是一个开源的工具包,将JasperReport包加入到项目的classpath中即可开始使用JasperReport包了,从java程序中通过调用包中的类对jrxml文件进行操作,可以完成报表的编译、显示、输出等工作。
关键词:

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 groupName) afterGroupInit(String groupName) 看看这些名字就知道你能完成那些功能,这几个方法是要求我们实现的,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 groupName) 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 groupName) 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
* Description: main
* Remark:
* @param args void
*/ public static void main(String[] args) { String path = "E:/ireport/jfreechat.jrxml"; File file = new File(path); InputStream in; try { HashMap parameters = new HashMap(); parameters.put("ReportTitle", "LAOSHULIN"); in = new FileInputStream(file); JasperReport jasperReport = JasperCompileManager.compileReport(in); for(int i = 0; i. */ 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
* Description: main
* Remark:
* @param args void
*/ 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 titleParameters = new HashMap(); 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。

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 15 金币 [ 分享文档获得金币 ] 4 人已下载

下载文档