最近在做报表的时候需要对数据进行分析并以饼形图,折线图等形式进行展示,为此使用jfreechart配合ireport和jasperreport配合使用,以达到生成PDF文档,并同时在文档中显示数据以及对数据进行分析后的各种图(主要为饼形图,折线图,柱状图等)的效果。jasperreport+ireport在前文已经讲述过,这里就不在多说了,重点说一下如何配合jfreechart生成分析图吧。主要思路是在jrxml文件中添加图片控件,图片空间引用变量打到将生成的图片画到pdf文件中的目的。我们需要做的步骤如下:
1.添加jar包引用,主要使用的jar如下:
2.在fontpath标签中引入上述中文包,然后在viewers标签下选择打开pdf文件的程序:
3.新增变量.如pieJfreeChart,Variable Class为net.sf.jasperreports.engine.JRRenderable,Calculation为System,Reset type为Report,Increment type 为None.
net.sf.jasperreports.engine.JRRenderable为jasperReport一个专门用来处理图表问题公共接口.
4.新增一个图片元素,并设置图片里的属性.将Image Expression设置为刚才的变量$V{jfreeChart};Expression Class为net.sf.jasperreports.engine.JRRenderable;Scale Image为Fill Frame;Horizontal Alignment为Left;Vertical Alignment为Top;Evaluation Time为Now.
5.ireport的工作基本完成,下面编写JAVA代码.新建一个类,继承JRDefaultScriptlet类,覆盖afterReportInit()方法,将画图的代码写在该方法里,并将最后的jfreeChart实体,用this.setVariableValue()方法塞到报表的变量里,以填充变量成为图形.
public class JChartReport extends JRDefaultScriptlet { public static JFreeChart jrchar; public void afterReportInit() throws JRScriptletException { /** 画出饼形图 **/ createPie(); /** 画出折线图 **/ createZXT(); /**画出柱形图**/ createCircular(); } /** * 画出饼形图 * * @throws JRScriptletException */ private void createPie() throws JRScriptletException { DefaultPieDataset dateset = LineCharts.createPieDataset(); JFreeChart freeChart = LineCharts.createPieChart("用户地区分布饼形图分析", dateset); PiePlot3D plot3D = (PiePlot3D) freeChart.getPlot(); plot3D.setNoDataMessage("无数据被展示"); // 设置$F{jfreeChart}变量的值 this.setVariableValue("pieJfreeChart", new JFreeChartRenderer(freeChart)); } /** * 画出折线图 * @throws JRScriptletException */ private void createZXT() throws JRScriptletException { DefaultCategoryDataset dateset = new DefaultCategoryDataset(); dateset = LineCharts.createDataset(); JFreeChart freeChart = LineCharts.createChart("募集资金折线图分析", dateset); CategoryPlot cp = (CategoryPlot) freeChart.getPlot(); cp.setNoDataMessage("无数据被展示"); // 设置$F{jfreeChart}变量的值 this.setVariableValue("lineJfreeChart", new JFreeChartRenderer( freeChart)); } /** * 画出柱状图 * @throws JRScriptletException */ public void createCircular() throws JRScriptletException{ CategoryDataset circulardataset = LineCharts.createCircularDataset(); JFreeChart freeChart = LineCharts.createCircularChart("资金分析柱形图",circulardataset); CategoryPlot plot = freeChart.getCategoryPlot();//设置图的高级属性 plot.setNoDataMessage("无数据被展示"); // 设置$F{jfreeChart}变量的值 this.setVariableValue("circularJfreeChart", new JFreeChartRenderer( freeChart)); } }
6.为了让图形可以在ireport的调试中显示,我们将上面这个类编译成class文件后,打包成jar包,再在ireport中将JAR包引用.工具->选项->classpath->add jar 加入我们打好的jar包,并打上勾将期引用.你的项目属性中将Scriptlet class设置成为你引用的JAR包中的class文件.Language改为java.
7.指定ScriptClass:
8.最后看一下生成效果: