Как заполнить данные диаграммы набором данных 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
Наслаждайтесь результатом