当前位置: 首页 > 知识库问答 >
问题:

如何使用Jasperreports中的JRBeanCollectionDatasource创建相同类型但具有不同数据系列的多个图表

邹修真
2023-03-14

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

要求:

1) 应使用JRBeanCollectionDatasource完成。

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

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

Java:

Coordinates.java

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

GenerateReport.java

我正在使用报表簿,报表簿的每个报表模板都被视为子报表。所以我传递XYChartDataSource(java.util.列表)到主报表簿,我将使用新net.sf.jasperreports.engine.data.JRB当做数据源表达式将此参数与子报表映射。

在子报表中,我已经创建了一个参数< code > 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>

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

预期输出:

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

图1

图表2

共有1个答案

凤明朗
2023-03-14

你的问题就在这里:

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

您的参数“XYChartDataSource”将包含列表中的最后一个条目,每次循环替换请参阅Map.put(K键,V值))

我们需要的是整个列表

parameters.put("XYChartDataSource", allchartData);

但是现在我们无法直接访问列表

不更改当前子报表的解决方案是在中间插入另一个子报表,它将迭代您的List

结构将是

>

  • 传递列表

    定义字段_THIS,该字段是列表

    详细频带包括电流子图。jrxml并传递$F{_THIS}作为数据源

    子图表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对这个答案做了很好的图示。

  •  类似资料:
    • 我使用下面的代码创建了20篇帖子,每个帖子都有3条评论。 相反,我想创建20个帖子,每个帖子都有随机数量的评论(例如,帖子1有2个评论,帖子2有4个评论,等等)。) 这不起作用,每个帖子都有相同(随机)数量的评论。 我怎样才能做到这一点?

    • 我正在使用的数据库有许多具有相同列但(显然)具有不同表名的表(不是我设计的)。例如(这些是数据库表名): 有没有可能用JPA和Hibernate将这些映射到一个Java类实体?类的名称是,然后在使用它时传入例如,以便对象使用表? 还是只使用普通的、普通的Java对象来完成这样的任务更好? 谢谢你!

    • 我的数据库中有两个表,这些表具有相同的精确列和数据类型,但顺序不同。 表A有列:A、B、C、D。 表B有以下列:A、C、D、B。 我有一个使用JooQ查询数据库的应用程序,它利用Codigen来创建表格和记录。但是,由于编译错误,它不允许我合并两个选择语句。我能做什么,把两张桌子合并起来? 在union函数内部的变量上,它与SelectUnionStep中的类型不匹配有关。关于union(ARec

    • 我使用一个Android库,它要求我创建两个类,每个类继承自不同的类 (具有公共基类) 现在我有这个代码: 我必须复制这个类来创建一个扩展,即使我的两个类共享完全相同的代码。 我简化了示例的代码,但重复可能很重要 我决定将代码放在这两个类之外的静态方法中,并在类重写的方法中调用它们,但我认为必须有一种更干净的方法来做到这一点。 你能帮我解决这个问题吗? 和都继承自。

    • 问题内容: 我用相同的数据源调用两个子报表,但是当我打印此报表时,只有我的第一个子报表填充了表格。 这就是我通过报告的方式。 虽然,我已经注意到,如果我像下面那样传递2个不同的对象,则它可以工作(下面对jrxml进行了相关修改),我得到了两个子报表。 这与成为消耗品有关吗? 这是我的主要jrxml 这是我的子报告 进行更改以使其可以使用2个参数 有什么更好的解决方法? 问题答案: 正如您在api中

    • 我有一个gradle android项目,有两个模块: 穿 在我的gradle配置中,我有不同的构建类型。默认设置(debug和release,每个都有自定义设置)以及dev和beta构建类型(也有自定义签名、自定义proguard和自定义applicationIdSuffix)。 我现在想做的是使用构建类型测试版(gradle清洁组件测试版)构建应用程序包。这就开始在测试版中构建应用程序,看到它