Charts 如何使用JavaBeans集合数据集填充图表数据?

Charts 如何使用JavaBeans集合数据集填充图表数据?,charts,jasper-reports,jaspersoft-studio,Charts,Jasper Reports,Jaspersoft Studio,我已经创建了一个工作的jrxml报告,该报告显示了一个由Java bean集合(List)的数据集填充的表 现在我想使用相同的数据集来创建图表(初学者使用的基本条形图)。每个bean包含我想在条形图上显示的4个值:月份、正常时间、旅行时间和加班时间。我希望每个bean会为每个月生成一组3条线,因此最终图表将包含从下到上的12x3条线,月份名称将作为3条线组下的标签,每个组从左到右排列在另一组的旁边 不幸的是,创建这个图表似乎比我想象的要困难得多。至少它看起来与创建表完全不同。我不确定Jasper

我已经创建了一个工作的jrxml报告,该报告显示了一个由Java bean集合(
List
)的数据集填充的表

现在我想使用相同的数据集来创建图表(初学者使用的基本条形图)。每个bean包含我想在条形图上显示的4个值:月份、正常时间、旅行时间和加班时间。我希望每个bean会为每个月生成一组3条线,因此最终图表将包含从下到上的12x3条线,月份名称将作为3条线组下的标签,每个组从左到右排列在另一组的旁边

不幸的是,创建这个图表似乎比我想象的要困难得多。至少它看起来与创建表完全不同。我不确定Jasper Studio的图表向导是否正常工作。至少它不允许我在“图表数据系列”对话框中添加任何系列:如果我按“添加”,则绝对不会发生任何事情-不会打开任何对话框,不会出现任何错误消息,也不会有任何事情提示我出了什么问题

主要问题是,我看不到将数据集数据连接到图表的方法

在尝试将图表嵌入主报表后,我还尝试将其添加到仅为用作图表容器而创建的新子报表中。我将主报表数据集作为数据源传递给子报表,并尝试将其用作子报表图表中的主数据集。数据集/图表连接仍然没有成功,例如,如果我按下Add按钮,仍然不会发生任何事情

下面你可以看到我正在使用的简单bean。首先,WorkingHoursReport是作为JRBeanCollectionDataSource传递给报告的bean。我相信这个bean最有趣的领域是工作时间bean列表。清单上总是有12个项目:每个月一个。这是我当前使用数据源表达式传递给我的表元素的列表:new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{workingHours})

WorkingHoursReport.java:

public class WorkingHoursReport extends CommonReport {
    private int year;
    private List<WorkingHours> workingHours;
}
public class WorkingHours {

    private int month = 0;
    private double hoursNormal = 0;
    private double hoursTravel = 0;
    private double hoursOvertime = 0;
    private double hoursTotal = 0;
    private double hoursTotalCumulative = 0;
 }
在尝试创建我的第一个图表时,我很自然地尝试使用定义数据源的相同命令将数据填充到图表中,因为我已经成功地使用了我的表:

new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{workingHours}).

不幸的是,至少jasper studio图表创建向导似乎没有与数据建立任何连接(没有打开任何对话框,根据文档,我应该可以在其中选择要绘制图表的数据字段)。

考虑到您使用的是java beans,我将以这种方式解决您的问题,需要对数据进行汇总,然后列出系列(小时)和类别(月)。不要将其连接到表数据源,而是为其创建特定的数据源

创建特定的图表bean

public class ChartData {
    private String serie;
    private String category;
    private double value;

    public ChartData(String serie, String category, double value) {
        super();
        this.serie = serie;
        this.category = category;
        this.value = value;
    }
    .... getter and setters         
}
用数据填充图表bean

循环您的数据集(列表)并填写图表数据列表,您可能需要一张地图来查找同一月份并添加到小时数中。我将不向您展示这一点,而是静态地创建它们来展示一个示例

List<ChartData> cList = new ArrayList<ChartData>();
cList.add(new ChartData("hoursNormal","month1", 12.3)); //The use of resources or static text is beyond this example
cList.add(new ChartData("hoursTravel","month1", 3.2));
cList.add(new ChartData("hoursOvertime","month1", 1.3));
cList.add(new ChartData("hoursNormal","month2", 16.4));
cList.add(new ChartData("hoursTravel","month2", 5.2));
cList.add(new ChartData("hoursOvertime","month2", 4.1));
JasperSoft Studio中的设置

享受结果


显示您正在使用的bean,这样我们就有了一些工作依据。我扩展了我的初始帖子,以包含bean中的片段。好的,谢谢,您希望每个工作小时有一个条形图,或者一个包含所有工作小时总和的条形图?只有一个图表,基本上列表中的每个工作小时bean都会在x轴上显示一个月。每个月都会在y轴上显示一组3个酒吧(一个酒吧用于正常、旅行和加班时间)“成长”。好的,今晚我将尝试回答你…非常感谢!我创建了第一张图表。不过,我仍然对Jasper软件研究有意见。即使按照您的指示创建了数据源和数据结构,Jasper soft studio的图表创建向导也无法从这些数据集中读取任何数据,向导仍然没有响应:例如,大多数应该打开对话框定义数据的按钮,我们仍然并没有做任何事情,向导仍然保持沉默和无反应。所以我唯一能做的就是复制粘贴在-tag中定义的jrxml代码。@Vka我在定义图表时在Studio视图中添加了视图。。。我没有你的问题…是的,那个视图看起来和我的屏幕一样。但是,如果我尝试按下那些“…”按钮,什么也不会发生。只有序列旁边的“…”按钮打开序列对话框,但若我尝试按那个里的“添加”按钮,什么也不会发生。即使从那里删除了现有的按钮,添加按钮也不会有任何响应。由于这个原因,我无法通过这个向导完整地创建图表:甚至不能在那里添加一个系列变量…以防万一,我在这里添加了一个新的后续问题:@vka,对我来说,它打开了表达式编辑器。。。我想你的安装有问题。。
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("CHART_DATASET", new JRBeanCollectionDataSource(cList));
<?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="working_hours" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="1a12c021-57e2-4482-a273-56cbd3f78a17">
    <subDataset name="chartDataSet" uuid="119b7f0e-01ef-4e2b-b628-d76f51e83768">
        <field name="serie" class="java.lang.String"/>
        <field name="category" class="java.lang.String"/>
        <field name="value" class="java.lang.Double"/>
    </subDataset>
    <parameter name="CHART_DATASET" class="net.sf.jasperreports.engine.data.JRBeanCollectionDataSource" isForPrompting="false"/>
    <summary>
        <band height="142" splitType="Stretch">
            <barChart>
                <chart>
                    <reportElement x="80" y="0" width="337" height="142" uuid="c8f4dc5d-47e7-489b-b27e-09976d90994a"/>
                    <chartTitle/>
                    <chartSubtitle/>
                    <chartLegend/>
                </chart>
                <categoryDataset>
                    <dataset>
                        <datasetRun subDataset="chartDataSet" uuid="abec2dce-b670-4e84-b71f-469d954dbcb5">
                            <dataSourceExpression><![CDATA[$P{CHART_DATASET}]]></dataSourceExpression>
                        </datasetRun>
                    </dataset>
                    <categorySeries>
                        <seriesExpression><![CDATA[$F{serie}]]></seriesExpression>
                        <categoryExpression><![CDATA[$F{category}]]></categoryExpression>
                        <valueExpression><![CDATA[$F{value}]]></valueExpression>
                    </categorySeries>
                </categoryDataset>
                <barPlot>
                    <plot/>
                    <itemLabel/>
                    <categoryAxisFormat>
                        <axisFormat/>
                    </categoryAxisFormat>
                    <valueAxisFormat>
                        <axisFormat/>
                    </valueAxisFormat>
                </barPlot>
            </barChart>
        </band>
    </summary>
</jasperReport>