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

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

鲁斯伯
2023-03-14

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

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

不幸的是,创建这个图表似乎比我想象的要困难得多。至少与创建表相比,它看起来完全不同。我不确定Jasper工作室的图表向导是否还能用。至少它不允许我在图表数据序列对话框中添加任何序列:如果我按下add,绝对不会发生任何事情——没有对话框打开,没有错误消息,什么都没有,没有任何东西可以提示我出了什么问题。

主要问题是我没有看到将数据集数据连接到图表的方法。

在尝试将图表嵌入到我的主报表后,我尝试将其也添加到仅用作图表容器的新子报表中。我将主报表数据集作为数据源传递给子报表,并尝试将其用作子报表图表中的主数据集。数据集/图表连接仍然没有运气,例如如果我按下添加按钮,仍然没有任何反应。

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

工作小时报告.java:

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

WorkingHours.java:

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工作室图表创建向导没有获得与数据的任何连接(没有打开对话框,根据文档,我应该能够选择要绘制图表的数据字段)。

共有1个答案

叶健柏
2023-03-14

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

创建特定的图表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));

通过参数映射将 List 作为数据源传递

Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("CHART_DATASET", new JRBeanCollectionDataSource(cList));

显示图表

现在,我们可以使用传递给参数$P{chart_DATASET}子数据集标题摘要带中显示图表

<?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>

JasperSoft Studio中的设置

享受结果吧

 类似资料:
  • 我正试图用图表可视化以下数据集。js 到目前为止,我已经知道如何使用日期作为标签。 我想在这个图表中以三行显示“确认”、“死亡”和“恢复”的值。因此,我将包括三个不同的数据集,对吗?如何从json作为数组访问所需的信息来填充数据数组? 谢谢你的支持

  • 问题内容: 我目前正在使用Page_Load中的以下代码创建和读取DataTable 我想知道如何转换此代码,以便它从SQL查询中读取?我正在尝试下面的代码,但不确定如何连接它们,以便页面加载中的数据表使用下面的SQL命令填充。 我被困在: 我希望成为 问题答案: 您需要修改方法,并在其中添加“实验”代码,然后返回。

  • 问题内容: 我正在尝试从表单填充bean列表: 因此,在我的Struts2表单中,填充Foo的最佳方法是什么?凭直觉,我想做: 但这不起作用,并且会导致碰撞。我敢肯定答案很简单,而且我忽略了它。 问题答案: 如果我正确理解,您只是想为每个隐藏字段使用不同的名称? 这应该给你相当于 如果您有适当的getter / setter,则应在提交表单时设置所有值。

  • 我无法用地图填充TableView 我有一个类,它拥有一个以产品名称为键、以正常价格为值的地图。我创建了一个tableView,其中一列是名称,一个主列是价格,分为两列normal和new,如下所示。 我已经做了这个方法使地图成为一个可观察列表。 这就是我卡住的地方。我不知道如何用这个可观察列表填充每个单元格。我确实知道我必须以某种方式使用“setCellFactory”。有人有什么建议吗?如何制