Как заполнить данные диаграммы набором данных JavaBeans?

Я уже создал рабочий отчет jrxml, представляющий таблицу, заполненную набором данных коллекции (Listбобов Java.

Теперь я хотел бы использовать тот же набор данных для создания диаграммы (базовая гистограмма для начинающих). Каждый компонент содержит 4 значения, которые я хотел бы отобразить на гистограмме: месяц, обычные часы, часы в пути и сверхурочные часы. Я надеялся, что каждый бин будет генерировать группу из 3 баров для каждого месяца, поэтому в конце график будет содержать 12x3 баров, растущих снизу вверх, и название месяца будет выступать в качестве метки под группами из 3 баров, каждая группа располагается рядом с другой, начиная слева направо.

К сожалению, создание этой диаграммы кажется намного сложнее, чем я думал. По крайней мере, это кажется совершенно другим по сравнению с созданием таблицы. Я не уверен, что мастер диаграмм Jasper Studio работает. По крайней мере, это не позволяет мне добавлять какие-либо серии в диалоге ряда данных диаграммы: если я нажимаю "Добавить", абсолютно ничего не происходит - ни одно диалоговое окно не открывается, ни сообщение об ошибке, ни что-либо, ничего, что бы намекнуло, что не так.

Основная проблема заключается в том, что я не вижу способа соединить данные набора данных с диаграммой.

Попытавшись встроить диаграмму в свой основной отчет, я также попытался добавить ее в новый подотчет, созданный только для того, чтобы действовать в качестве контейнера диаграммы. Я передал набор данных основного отчета в качестве источника данных для подотчета и попытался использовать его в качестве основного набора данных в диаграмме подотчета. Все еще не повезло с соединением набора данных / диаграммы, например, все еще ничего не происходит, если я нажимаю кнопку Add.

Ниже вы можете увидеть простые бобы, которые я использую. Во-первых, WorkingHoursReport - это bean-компонент, который я передаю, чтобы сообщить как JRBeanCollectionDataSource. Я считаю, что самое интересное поле этого компонента - это список WorkingHours-компонентов. В этом списке всегда будет 12 пунктов: по одному на каждый месяц. Это список, который я сейчас передаю своему элементу таблицы, используя выражение источника данных: new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource ($ F {workingHours}).

WorkingHoursReport.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 Studio не смог подключиться к данным (не открывалось диалоговое окно, в котором, согласно документам, я должен был выбрать поля данных для диаграммы).

1 ответ

Решение

Вот как я бы решил вашу проблему, учитывая, что вы используете Java-бины, должны суммировать данные, а затем иметь как серии (часы), так и категории (месяцы). Не подключайте его к источнику данных таблицы, а создайте для него определенный источник данных.

Создать конкретный бин диаграммы

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         
}

Заполните бин диаграммы данными

Зациклите ваш набор данных (Список) и заполните список ChartData, вам, вероятно, понадобится карта, чтобы найти тот же месяц и добавить к часам. Я не буду показывать вам это, но создайте их статически, чтобы показать пример

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));

Передайте список как источник данных через карту параметров

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

Показать график

Теперь мы можем отобразить график в title или же summary группа, использующая subDataset передается по параметру $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

студия

Наслаждайтесь результатом

Результат

Другие вопросы по тегам