如何使用Jasperreports

时间:2016-09-13 08:18:56

标签: jasper-reports

我必须使用相同的图表报告模板创建具有不同数据集的多个XY线图,我还必须使用JRBeanCollectionDatasource。

要求:

1)应该使用JRBeanCollectionDatasource完成。

2)必须使用相同的图表报告模板来创建多个图表。

3)图表数量不固定(这里我有问题在java中给报告参数命名)。因为在ReportParametersMap中,它们只能有唯一的键名。

爪哇:

Coordinates.java

private Number series;
private Number xCoordinate;
private Number yCoordinate;
//Getters & Setters

GenerateReport.java

我正在使用报告手册,报告手册的每个报告模板都被视为子报告。所以我将XYChartDataSource(java.util.List)传递给主报告书,我将使用子报告映射此参数   new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{XYChartDataSource})作为数据源表达式。

在Subreport中,我创建了一个参数XYChartDataSource(java.util.List)并在MainDataset中创建了字段(series,xCoordinate,yCoordinate)(在图表中使用)

List<List<Coordinates>> allchartData = new ArrayList<>();
List<Coordinates> chartData = new ArrayList<>();

chartData.add(new Coordinates(2.08, xCoordinate, yCoordinate));
chartData.add(new Coordinates(2.08, xCoordinate, yCoordinate));
chartData.add(new Coordinates(2.08, xCoordinate, yCoordinate));
allchartData.add(chartData);
.
.
.
chartData.add(new Coordinates(2.12, xCoordinate, yCoordinate));
chartData.add(new Coordinates(2.12, xCoordinate, yCoordinate));
chartData.add(new Coordinates(2.12, xCoordinate, yCoordinate));
allchartData.add(chartData);
.
.
.


for (int i = 0; i < baselineChartData.size(); i++) {
            parameters.put("XYChartDataSource", allchartData.get(i));
    }

main_report_book.jrxml

<parameter name="XYChartDataSource" class="java.util.List"/>

        <part uuid="5e668430-9acd-4835-be21-f4e2902ce33d">
            <p:subreportPart xmlns:p="http://jasperreports.sourceforge.net/jasperreports/parts" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/parts http://jasperreports.sourceforge.net/xsd/parts.xsd">
                <subreportParameter name="REPORT_DATA_SOURCE">
                    <subreportParameterExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{XYChartDataSource})]]></subreportParameterExpression>
                </subreportParameter>
                <subreportExpression><![CDATA[$P{SUBREPORT_DIR}+"/sub_chart.jasper"]]></subreportExpression>
            </p:subreportPart>
        </part>

sub_chart.jrxml

<parameter name="XYChartDataSource" class="java.util.List"/>
<field name="xCoordinate" class="java.lang.Double"/>
<field name="yCoordinate" class="java.lang.Double"/>
<field name="series" class="java.lang.Double"/>
    <summary>
        <band height="405">
            <xyLineChart>
                <chart evaluationTime="Report" bookmarkLevel="1">
                    <reportElement x="30" y="98" width="525" height="230" uuid="627d87d6-b675-409c-accb-b2bb3ffb9c80">
                        <property name="net.sf.jasperreports.chart.domain.axis.tick.interval" value="1"/>
                    </reportElement>
                    <chartTitle/>
                    <chartSubtitle/>
                    <chartLegend position="Right"/>
                </chart>
                <xyDataset>
                    <xySeries autoSort="true">
                        <seriesExpression><![CDATA[$F{series}]]></seriesExpression>
                        <xValueExpression><![CDATA[$F{xCoordinate}]]></xValueExpression>
                        <yValueExpression><![CDATA[$F{yCoordinate}]]></yValueExpression>

                    </xySeries>
                </xyDataset>
                <linePlot isShowShapes="false">
                    <plot/>
                    <categoryAxisFormat>
                        <axisFormat/>
                    </categoryAxisFormat>
                    <valueAxisFormat>
                        <axisFormat/>
                    </valueAxisFormat>
                </linePlot>
            </xyLineChart>






            </textField>
        </band>
    </summary>

当前输出: 使用常规方法只打印一个图表。

enter image description here

预期输出:

这里我显示了两个图表(实际输出可能更多),需要从相同的报告模板中生成相同的PDF报告:

  

chart1

enter image description here

  

chart2

enter image description here

1 个答案:

答案 0 :(得分:8)

你的问题在这里:

for (int i = 0; i < baselineChartData.size(); i++) {
        parameters.put("XYChartDataSource", allchartData.get(i));
}

您的参数"XYChartDataSource"将包含List中的最后一个条目,您每次循环都会替换Map.put(K key,V value)}

我们需要的是整个列表

parameters.put("XYChartDataSource", allchartData);

但是现在我们无法直接访问List<Coordinates>

关于不更改当前子报表的解决方案是在中间插入另一个子报表,这将在详细信息频段中迭代List<List<Coordinates>>

结构将是

  1. List<List<Coordinates>> allchartData作为数据源传递给此新子报表(sub_charts.jrxml)

  2. 定义子报告中_THIS的字段List<Coordinates>(因此它正在迭代您的List<List<Coordinates>>

  3. 详细信息包括当前的sub_chart.jrxml并将$F{_THIS}作为数据源传递

  4. <强> sub_charts.jrxml

    <?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="sub_charts" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="bc8c76ba-0b85-4522-bf67-4c62ae87202b">
        <field name="_THIS" class="java.util.List">
            <fieldDescription>_THIS</fieldDescription>
        </field>
        <detail>
            <band height="63" splitType="Stretch">
                <subreport>
                    <reportElement x="0" y="0" width="550" height="60" uuid="b0e761bf-fe02-4a0a-bafb-32d6831b7a13"/>
                     <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{_THIS})]]></dataSourceExpression>
                     <subreportExpression><![CDATA[$P{SUBREPORT_DIR}+"/sub_chart.jasper"]]></subreportExpression>
                </subreport>
            </band>
        </detail>
    </jasperReport>
    

    请记住在 main_report_book.jrxml 中调用此新子报告。

    <subreportExpression><![CDATA[$P{SUBREPORT_DIR}+"/sub_charts.jasper"]]></subreportExpression>
    

    OP Dhruvil Thaker完成了这个答案的精彩图形表示。

    graphical representation