JasperReports创建图表 JasperReports创建子报告 JasperReports Crosstabs 早期人们不得不依靠scriptlet收集图表数据并使用报告模板中的图像元素渲染图表。JasperReports现在变得简单,因为它内置了对使用新图表组件的图表的支持。 使用新的图表组件,用户只需应用可视设置并定义有助于构建图表数据集的表达式。JasperReports使用JFreeChart作为底层图表库。配置新图表组件时,涉及以下三个组件 整体图表组件。 图表数据集(将图表数据相关设置分组)。 图表图表(对图表项目的呈现方式相关的视觉设置进行分组)。 JasperReports目前支持以下类型的图表:Pie,Pie 3D,Bar,Bar 3D,XY Bar,Stacked Bar,Stacked Bar 3D,Line,XY Line,Area,XY Area,Stacked Area,Scatter,Bubble,Time Series,High - 低开,关闭,烛台,多轴,仪表,温度计和甘特图。 图表属性 图表是常规报表元素,因此它们与所有其他报表元素共享其某些属性。有一个名为 <chart> 的JRXML元素,用于创建所有类型的图表。此元素将特定于图表的特定设置分组,这些设置适用于所有类型的图表。 图表子元素 <chart>元素的子元素是 - <reportElement> - 这些是可显示的对象,例如放在报表模板部分中的静态文本,文本字段,图像,线条和矩形。 <Box> - 此元素用于通过可在每侧自定义的边框环绕图表。 <chartTitle> - 此元素用于放置图表的标题。该 位置 属性决定在报告中的图表的标题位置。此元素具有属性 - 位置 (值可以是 顶部 , 底部 , 左侧 , 右侧 .Deafult值是 顶部 ), 颜色 。<chartTitle>将 font 和 titleExpression 作为子元素。 <chartSubtitle> - 此元素用于放置图表的副标题。此元素具有属性 - 颜色 。<chartSubtitle>将 font 和 subtitleExpression 作为子元素。 <chartLegend> - 元素可以使用此元素控制字体相关属性以及图表图例的文本颜色和背景颜色。此元素具有属性 - textColor 和 backgroundColor 。 <anchorNameExpression> - 此元素为锚点创建目标。 <hyperlinkReferenceExpression> - 此元素包含一个报告表达式,指示外部资源的名称(通常是URL)。 <hyperlinkAnchorExpression> - 超链接指向外部资源中的锚点。 <hyperlinkPageExpression> - 超链接指向当前报告中的页面。 <hyperlinkTooltipExpression> - 此元素控制超链接的工具提示。表达式的类型应该是 java.lang.String 。 <hyperlinkParameter> - 此元素(如果存在)根据参数值生成最终超链接。 图表属性 可用于所有图表类型的元素中的属性是 - isShowLegend - 如果图表图例将显示在报表上,则此属性用于确定。 值可能为 true 或 false 。默认值为 true 。 evaluationTime - 确定何时 评估 图表的表达式。值可以是 Now , Report , Page , Column , Group , Band 。默认值为 Now 。 evaluationGroup - 此属性确定用于评估图表表达式的组的名称。 此属性的值必须与组的名称匹配,我们希望将其用作图表的评估组。 hyperlinkType - 此属性可以包含任何文本值。 默认值为 None 。这意味着,即使存在特殊的超链接表达式,文本字段和图像也不代表超链接。 hyperlinkTarget - 此属性有助于在查看器中单击指定链接时自定义指定链接的行为。 值可以是 Self 或 Blank 。默认值为 Self 。 bookmarkLevel - 此属性设置为正整数时,会在导出为PDF的报表中生成书签。 默认值为 0 。 customizerClass - 这是可用于自定义图表的类(可选)的名称。 此元素的值必须是包含自定义程序类名称的String。 图表定制 如上所述,JasperReports使用 JFreeChart 作为底层图表库。 JFreeChart 包含JasperReports不直接支持的功能。我们可以通过元素中的 customizerClass 属性提供自定义程序类来利用这些功能。定制器类不是什么,而是 net.sf.jasperreports.engine.JRChartCustomizer 接口的 实现 。实现此界面的最简单的方法是通过扩展 net.sf.jasperreports.engine.JRAbstractChartCustomizer 类和因此具有访问参数,字段和变量基于报告数据更加灵活的图表的定制。 图表数据集 所有图表类型的常见属性之一是<dataset>元素。图表数据集有助于在运行时映射报表数据和检索图表数据。每个图表类型包含不同的子元素以定义图表的表达式。这些表达式定义用于生成图表的数据。所有这些子元素都包含一个<dataset>元素,用于定义何时评估和重置图表的表达式。 JasperReports中提供了几种类型的图表数据集,因为每种类型的图表都适用于某些数据集:饼图,类别,XY,时间序列,时间段,XYZ和高 - 低。这些数据集类型中的每一个都实现了定义图表数据集的 net.sf.jasperreports.engine.JRChartDataset 接口。所有图表数据集都以相同的方式初始化和递增; 但是,它们的区别仅在于它们映射的数据类型或数据系列。 数据集属性 下面给出的表总结了元素<dataset>的属性 属性 描述 值 resetType 此属性确定何时重置图表表达式的值。 无,报告,页面,列,组。默认值为Report。 resetGroup 此属性确定重置图表表达式值的组的名称。 此属性的值必须与JRXML报告模板中声明的任何组的名称匹配。 incrementType 此属性确定何时重新计算图表表达式的值。 无,报告,页面,列,组。默认值为“无”。 incrementGroup 此属性确定重新计算图表表达式的组的名称。 此属性的值必须与JRXML报告模板中声明的组的名称匹配。 下表总结了元素的子元素 - 子元素 描述 <incrementWhenExpression> 可以通过使用此子元素过滤掉不需要的数据来自定义图表数据集递增的方式。 <datasetRun> 其中包含实例化报表子数据集所需的信息。 数据集类型 具体的数据集类型解释如下 - Pie Dataset 饼图数据集的特征在于以下表达式 - <keyExpression> - 表示将构成饼图中切片的类别。该表达式可以返回任何java.lang.Comparable对象。 <valueExpression> - 生成与数据集中的每个类别/键对应的值。值始终是java.lang.Number对象。 <labelExpression> - 如果缺少此表达式,图表将显示饼图中每个切片的默认标签。使用此表达式返回java.lang.String值,以自定义饼图的项标签。 <sectionHyperlink> - 设置与饼图部分关联的超链接。 类别数据集 类别数据集由<categorySeries>元素表征,其中包含 - <seriesExpression> - 表示系列的名称。该表达式可以返回任何java.lang.Comparable对象。 <categoryExpression> - 返回系列表达式指定的系列中每个值的类别名称。类别是java.lang.Comparable对象。 <valueExpression> - 生成与数据集中每个类别对应的值。值始终是java.lang.Number对象。 <labelExpression> - 如果缺少此表达式,图表将显示图表中每个项目的默认标签。使用此表达式返回java.lang.String值,以自定义图表的项标签。 <itemHyperlink> - 设置与图表项关联的超链接。 XY数据集 XY数据集由元素表征,其中包含 - <seriesExpression> - 表示系列的名称。该表达式可以返回任何java.lang.Comparable对象。 <xValueExpression> - 返回表示将添加到当前数据系列的(x,y)对的X值的java.lang.Number值。 <yValueExpression> - 返回表示将添加到当前数据系列的(x,y)对的Y值的java.lang.Number值。 <labelExpression> - 如果缺少此表达式,图表将显示图表中每个项目的默认标签。使用此表达式返回java.lang.String值,以自定义图表的项标签。 <itemHyperlink> - 设置与图表项关联的超链接。 XYZ数据集 XYZ数据集由元素表征,其中包含 - <seriesExpression> - 表示系列的名称。该表达式可以返回任何java.lang.Comparable对象。 <xValueExpression> - 返回表示将添加到当前数据系列的(x,y,z)项的X值的java.lang.Number值。 <yValueExpression> - 返回表示将添加到当前数据系列的(x,y,z)项目中的Y值的java.lang.Number值。 <zValueExpression> - 返回表示将添加到当前数据系列的(x,y,z)项的Z值的java.lang.Number值。 <labelExpression> - 如果缺少此表达式,图表将显示图表中每个项目的默认标签。使用此表达式返回java.lang.String值,以自定义图表的项标签。 <itemHyperlink> - 设置与图表项关联的超链接。 时间序列数据集 时间序列数据集由timePeriod属性和元素表征。timePeriod属性指定数据集内数据系列的类型。时间序列可以包含与天,月,年或其他预定义时间段相关联的数值。可能的值包括: 年,季度,月,周,日 - 这是默认值,小时,分钟,秒,毫秒。 <timeSeries>元素包含 - <seriesExpression> - 表示系列的名称。该表达式可以返回任何java.lang.Comparable对象。 <timePeriodExpression> - 返回一个java.util.Date值,引擎将根据上面提到的timePeriod属性设置的值从中提取相应的时间段。 <valueExpression> - 返回java.lang.Number值,以便在递增数据集的当前序列时与相应的时间段值相关联。 <labelExpression> - 如果缺少此表达式,图表将显示图表中每个项目的默认标签。使用此表达式返回java.lang.String值,以自定义图表的项标签。 <itemHyperlink> - 设置与图表项关联的超链接。 时间段数据集 时间段数据集由元素表征,其中包含 - <seriesExpression> - 表示系列的名称。该表达式可以返回任何java.lang.Comparable对象。 <startDateExpression> - 指定将数值添加到时间段序列时与之关联的日期间隔的开头。 <endDateExpression> - 指定将数值添加到时间段序列时与之关联的日期间隔的结束。 <valueExpression> - 返回java.lang.Number值,以与开始日期和结束日期表达式指定的当前日期间隔关联。 <labelExpression> - 如果缺少此表达式,图表将显示图表中每个项目的默认标签。使用此表达式返回java.lang.String值,以自定义图表的项标签。 <itemHyperlink> - 设置与图表项关联的超链接。 高低数据集 高低数据集的特征在于以下表达式 - <seriesExpression> - 目前,High-Low或Candlestick图表中仅支持一个系列。但是,此单个系列必须由此表达式返回的java.lang.Comparable值标识,并且还必须用作图表图例中的系列名称。 <dateExpression> - 返回当前(高,低,开,结,体积)项所引用的日期。 <highExpression> - 返回java.lang.Number值,该值将在数据集递增时添加到系列中的数据项的一部分。 <lowExpression> - 返回java.lang.Number值,该值将在数据集递增时添加到系列中的数据项的一部分。 <openExpression> - 返回java.lang.Number值,该值将是数据集递增时添加到系列的数据项的一部分。 <closeExpression> - 返回java.lang.Number值,该值将是数据集递增时添加到系列的数据项的一部分。 <volumeExpression> - 一个数值表达式,返回用于当前数据项的音量值。它仅用于烛台图表。 <itemHyperlink> - 设置与图表项关联的超链接。 价值数据集 这是一个特殊的图表数据集实现,包含单个值,用于呈现Meter和Thermometer图表。使用<valueExpression>表达式收集该值。 图表图 所有图表类型的另一个常见JRXML元素是<plot>元素。这允许我们定义几个图表的特征,如方向和背景颜色。根据图表的类型,图表不同。 绘图属性 下面给出的表总结了<plot>元素的属性 属性 描述 值 backcolor 此属性定义图表的背景颜色。 任何六位十六进制值都是此属性的有效值。十六进制值必须以#开头。 orientation 此属性定义图表的方向。 水平,垂直默认值为“垂直” backgroundAlpha 此属性定义图表背景颜色的透明度。 此属性的有效值包括0到1之间的任何十进制数,包括0和1。数字越大,背景透明度越低。默认值为“1”。 foregroundAlpha 此属性定义图表前景色的透明度。 此属性的有效值包括0到1之间的任何十进制数,包括0和1。数字越大,背景透明度越低。默认值为“1”。 labelRotation 此属性允许在x轴上旋转文本标签以顺时针或逆时针旋转。此属性仅适用于x轴不是数字或不显示日期的图表。 默认值为“0.0”。 <plot>元素有一个子元素<seriesColor>,其属性为: seriesOrder 和 color 。此元素自定义系列的颜色,以及它们在颜色序列中的位置。 图表的特定设置 piePlot - 它没有特定的设置 pie3DPlot - 包含 depthFactor 属性,数值范围从0到1,表示饼图的深度占绘图区域高度的百分比。 barPlot - 可以显示或隐藏刻度标签,刻度线或项目标签,并提供两个轴的设置。 bar3DPlot - 提供与 barPlot 相同的设置,并使用xOffset和yOffset属性生成3D效果。 linePlot - 可以显示或隐藏连接项目点的线条,可以显示或隐藏与项目点关联的形状,并提供两个轴的设置。 scatterPlot - 与 linePlot 类似,它可以显示或隐藏连接项目点的线条,可以显示或隐藏与项目点相关联的形状,并提供两个轴的设置。 areaPlot - 提供两个轴的设置。 bubblePlot - 可以通过设置scaleType属性来设置气泡尺寸,并为两个轴提供设置。 timeSeriesPlot - 可以显示或隐藏连接项目点的线条,可以显示或隐藏与项目点相关联的形状,并提供两个轴的设置。 highLowPlot - 可以显示或隐藏打开的刻度,可以显示或隐藏关闭刻度,并提供两个轴的设置。 candlestickPlot - 可以显示或隐藏音量,并为两个轴提供设置。 meterPlot - 包含表盘形状,刻度角,测量单位,刻度间隔,刻度盘颜色,针颜色,刻度颜色,值显示字体,颜色和格式图案,数据范围和仪表间隔的特定设置。 thermometerPlot - 包含值位置,水银颜色,显示/隐藏值行,值显示字体,颜色和格式模式,数据范围,低范围,中等范围和高范围的特定设置。 multiAxisChart - 包含 绘图中 包含的轴的特定设置。 图表类型 JasperReports为多种图表类型提供内置支持。它们列出如下 - pieChart - 饼图数据集和饼图的组合。 pie3DChart - 对饼图数据集和饼图3D图进行分组。 barChart - 类别数据集和条形图的基本组合。 bar3DChart - 包装类别数据集和条形3D图。 xyBarChart - 支持时间段数据集,时间序列数据集和XY数据集,并使用条形图来渲染轴和项目。 stackedBarChart - 使用Category数据集中的数据并使用Bar图表呈现其内容。 stackedBar3DChart - 使用Category数据集中的数据并使用Bar 3D绘图呈现其内容。 lineChart - 对类别数据集和线图进行分组。 xyLineChart - 对XY数据集和线图进行分组。 areaChart - 使用“区域”图绘制“类别”数据集中的项目。 stackedAreaChart - 使用“区域”图绘制“类别”数据集中的项目。 xyAreaChart - 使用XY数据集中的数据并通过“区域”图绘制它。 scatterChart - 使用Scatter图包装XY数据集。 bubbleChart - 将XYZ数据集与气泡图合并。 timeSeriesChart - 对时间序列数据集和时间序列图进行分组。 highLowChart - 高 - 低数据集和高 - 低图的组合。 candlestickChart - 使用来自High-Low数据集的数据,但使用特殊的Candlestick图。 meterChart - 使用Meter绘图中的渲染选项,从刻度盘上的Value数据集显示单个值。 thermometerChart - 使用Thermometer图中的渲染选项显示Value数据集中的单个值。 multiAxisChart - 包含多个范围轴,所有轴共享一个公共域轴。 例 为了演示图表,让我们编写一个新的报告模板(jasper_report_template.jrxml)。在这里,我们将<barChart>元素添加到<pageHeader>部分,将<pieChart>添加到<summary>部分。我们将在图表中显示为每个主题获得的标记。将其保存到目录 C:\ tools \ jasperreports-5.0.1 \ test 。该文件的内容如下 - <?xml version = "1.0" encoding = "UTF-8"?> <jasperReport xmlns = "http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name = "jasper_report_template" pageWidth = "595" pageHeight = "860" columnWidth = "515" leftMargin = "40" rightMargin = "40" topMargin = "50" bottomMargin = "50"> <field name = "subjectName" class = "java.lang.String"/> <field name = "marks" class = "java.lang.Integer"/> <variable name = "countNumber" class = "java.lang.Integer" calculation = "Count"> <variableExpression> <![CDATA[Boolean.TRUE]]> </variableExpression> </variable> <background> <band splitType = "Stretch"/> </background> <title> <band height = "79" splitType = "Stretch"/> </title> <pageHeader> <band height = "200"> <barChart> <chart evaluationTime = "Report"> <reportElement x = "0" y = "0" width = "555" height = "200"/> <chartTitle> <titleExpression> <![CDATA["My First JR Bar Chart"]]> </titleExpression> </chartTitle> </chart> <categoryDataset> <dataset incrementType = "None"/> <categorySeries> <seriesExpression> <![CDATA[$F{subjectName}]]> </seriesExpression> <categoryExpression> <![CDATA[$F{subjectName}]]> </categoryExpression> <valueExpression> <![CDATA[$F{marks}]]> </valueExpression> </categorySeries> </categoryDataset> <barPlot isShowTickMarks = "false"> <plot/> </barPlot> </barChart> </band> </pageHeader> <columnHeader> <band height = "20" splitType = "Stretch"/> </columnHeader> <detail> <band height = "20" splitType = "Stretch"/> </detail> <columnFooter> <band height = "20" splitType = "Stretch"/> </columnFooter> <pageFooter> <band height = "20" splitType = "Stretch"/> </pageFooter> <summary> <band height = "400" splitType = "Stretch"> <pieChart> <chart evaluationTime = "Report"> <reportElement x = "135" y = "0" width = "270" height = "300"/> <chartTitle> <titleExpression> <![CDATA["My First JR Pie Chart"]]> </titleExpression> </chartTitle> </chart> <pieDataset> <dataset incrementType = "None"/> <keyExpression> <![CDATA[$F{subjectName}]]> </keyExpression> <valueExpression> <![CDATA[$F{marks}]]> </valueExpression> </pieDataset> <piePlot> <plot/> <itemLabel/> </piePlot> </pieChart> </band> </summary> </jasperReport> 以上文件的详情如下 - 用于创建条形图的JRXML元素是<pageHeader>中的</barChart>。它包含一个</chart>子元素,其中包含一个<reportElement>子元素,用于定义图表的尺寸和位置。 条形图中的<dataset>元素必须包含在<categoryDataset>和</categoryDataset> JRXML元素之间。 <categoryDataset>必须包含<categorySeries>元素。此元素定义条形将表示的数据元素(在此示例中为主题名称)。 <categoryDataset>还必须包含一个元素,该元素定义如何将数据分成类别以进行比较。这里,数据按主题名称分隔。 <valueExpression>元素定义了用于确定图表中每个条形图值的表达式。在这里,我们使用“标记”。 对于饼图,我们在<summary>部分下使用了<pieChart>元素。它包含一个</chart>子元素。 子元素包含一个报表表达式,指示要在图表中用作键的内容。在这里,我们使用了subjectName。 子元素包含用于计算键值的表达式。在这里,我们使用了标记。 报告填充的java代码保持不变。文件 C:\ tools \ jasperreports-5.0.1 \ test \ src \ com \ codingdict \ JasperReportFill.java 的内容如下所示 - package com.codingdict; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; public class JasperReportFill { @SuppressWarnings("unchecked") public static void main(String[] args) { String sourceFileName = "C://tools/jasperreports-5.0.1/test/jasper_report_template.jasper"; DataBeanList DataBeanList = new DataBeanList(); ArrayList<DataBean> dataList = DataBeanList.getDataBeanList(); JRBeanCollectionDataSource beanColDataSource = new JRBeanCollectionDataSource(dataList); Map parameters = new HashMap(); try { JasperFillManager.fillReportToFile( sourceFileName, parameters, beanColDataSource); } catch (JRException e) { e.printStackTrace(); } } } 由于我们将显示为每个主题获得的标记,因此需要更改POJO。文件 C:\ tools \ jasperreports-5.0.1 \ test \ src \ com \ codingdict \ DataBean.java的 内容如下 - package com.codingdict; public class DataBean { private String subjectName; private Integer marks; public String getSubjectName() { return subjectName; } public void setSubjectName(String subjectName) { this.subjectName = subjectName; } public Integer getMarks() { return marks; } public void setMarks(Integer marks) { this.marks = marks; } } 甚至文件 C:\ tools \ jasperreports-5.0.1 \ test \ src \ com \ codingdict \ DataBeanList.java的内容也 需要更新,如下所示 - package com.codingdict; import java.util.ArrayList; public class DataBeanList { public ArrayList<DataBean> getDataBeanList() { ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>(); dataBeanList.add(produce("English", 58)); dataBeanList.add(produce("SocialStudies", 68)); dataBeanList.add(produce("Maths", 38)); dataBeanList.add(produce("Hindi", 88)); dataBeanList.add(produce("Scince", 78)); return dataBeanList; } /* * This method returns a DataBean object, with subjectName , * and marks set in it. */ private DataBean produce(String subjectName, Integer marks) { DataBean dataBean = new DataBean(); dataBean.setSubjectName(subjectName); dataBean.setMarks(marks); return dataBean; } } 报告生成 接下来,让我们使用常规的ANT构建过程编译并执行上述文件。文件build.xml的内容(保存在目录C:\ tools \ jasperreports-5.0.1 \ test下面)如下所示。 导入文件 - baseBuild.xml是从环境设置一章中选取的,应该与build.xml放在同一目录中。 <?xml version = "1.0" encoding = "UTF-8"?> <project name = "JasperReportTest" default = "viewFillReport" basedir = "."> <import file = "baseBuild.xml" /> <target name = "viewFillReport" depends = "compile,compilereportdesing,run" description = "Launches the report viewer to preview the report stored in the .JRprint file."> <java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true"> <arg value = "-F${file.name}.JRprint" /> <classpath refid = "classpath" /> </java> </target> <target name = "compilereportdesing" description = "Compiles the JXML file and produces the .jasper file."> <taskdef name = "jrc" classname = "net.sf.jasperreports.ant.JRAntCompileTask"> <classpath refid = "classpath" /> </taskdef> <jrc destdir = "."> <src> <fileset dir = "."> <include name = "*.jrxml" /> </fileset> </src> <classpath refid = "classpath" /> </jrc> </target> </project> 接下来,让我们打开命令行窗口并转到build.xml所在的目录。最后,执行命令 ant -Dmain-class = com.codingdict.JasperReportFill (viewFullReport是默认目标),如下所示 - C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.codingdict.JasperReportFill Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml clean-sample: [delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jasper [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint compile: [mkdir] Created dir: C:\tools\jasperreports-5.0.1\test\classes [javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:28: warning: 'includeantruntime' was not set, defaulting to bu [javac] Compiling 3 source files to C:\tools\jasperreports-5.0.1\test\classes compilereportdesing: [jrc] Compiling 1 report design files. [jrc] log4j:WARN No appenders could be found for logger (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory). [jrc] log4j:WARN Please initialize the log4j system properly. [jrc] log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK. run: [echo] Runnin class : com.codingdict.JasperReportFill [java] log4j:WARN No appenders could be found for logger (net.sf.jasperreports.extensions.ExtensionsEnvironment). [java] log4j:WARN Please initialize the log4j system properly. viewFillReport: [java] log4j:WARN No appenders could be found for logger (net.sf.jasperreports.extensions.ExtensionsEnvironment). [java] log4j:WARN Please initialize the log4j system properly. BUILD SUCCESSFUL Total time: 19 minutes 45 seconds 作为上述编译的结果,JasperViewer窗口打开,如下面的屏幕 - 在这里,我们看到条形图是在页眉中创建的,饼图是在摘要部分中创建的。 JasperReports创建子报告 JasperReports Crosstabs