Топ контрибуторов
loading
loading
Знаете ли Вы, что

Список полученных сертификатов находится на странице Вашего профиля. Сертификаты можно распечатать или разместить на Вашем сайте.

Лента обновлений
ссылка 13:45:44
Комментарий от Olga_Mogir:
Не 100%. Есть очень маленькая вероятность (но есть) с...
ссылка 13:32:37
Комментарий от Olga_Mogir:
Цель: при многократном прохождении в обе стороны оста...
ссылка 02:05:51
Комментарий от Blohin:
спасибо за ответ
ссылка Mar 21 22:40
Комментарий от k098:
Не зря видео-конференции на ютубе смотрел на тему "Неадеква...
ссылка Mar 21 22:33
Комментарий от k098:
Понятия не имею, что такое JavaBean, но ответил правильно т...
Статистика

Тестов: 153, вопросов: 8597. Пройдено: 430040 / 2106822.

JasperReports & iReport. Часть 2

head tail Статья
дата13.02.2015
авторHeorhi_Puhachou
голосов6

Предисловие

Данная статья является продолжением статьи JasperReports & iReport. В это статье почти не будет Java, поближе рассмотрим iReport: будем группировать данные, создавать переменные и строить графики. Рабочий проект для данной статьи - это усовершенствованный проект из предыдущей. Если не терпится посмотреть на конечный результат, то его можно скачать отсюда - https://github.com/Heorhi-Puhachou/JasperReports-iReport-2

Что уже должно быть

Подразумевается, что для практического повторения всех описанных ниже шагов, должен быть выкачан проект предыдущей статьи - https://github.com/Heorhi-Puhachou/JasperReports-iReport и установлен iReport. Хотя никто не запрещает просто прочитать статью.

Источник данных

Как и в предыдущей статье будем использовать заглушку – DAOStub. В ней будет больше данных для наглядности результата. Собственно, это всё, что касается Java-части:


package com.heorhi.jr.sample;

import java.util.ArrayList;

public class DAOStub {

	public ArrayList<DataBean> getDataBeanList() {
		ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();
		DataBean tempBean = new DataBean();
		tempBean.setName("Петя");
		tempBean.setDiscipline("Физика");
		tempBean.setAbsence(2);
		dataBeanList.add(tempBean);
		
		tempBean = new DataBean();
		tempBean.setName("Петя");
		tempBean.setDiscipline("Физика");
		tempBean.setAbsence(3);
		dataBeanList.add(tempBean);
		
		tempBean = new DataBean();
		tempBean.setName("Петя");
		tempBean.setDiscipline("Математика");
		tempBean.setAbsence(2);
		dataBeanList.add(tempBean);

		tempBean = new DataBean();
		tempBean.setName("Вася");
		tempBean.setDiscipline("История");
		tempBean.setAbsence(6);
		dataBeanList.add(tempBean);

		tempBean = new DataBean();
		tempBean.setName("Ира");
		tempBean.setDiscipline("English");
		tempBean.setAbsence(5);
		dataBeanList.add(tempBean);
		
		tempBean = new DataBean();
		tempBean.setName("Ира");
		tempBean.setDiscipline("English");
		tempBean.setAbsence(3);
		dataBeanList.add(tempBean);
		
		tempBean = new DataBean();
		tempBean.setName("Ира");
		tempBean.setDiscipline("Физика");
		tempBean.setAbsence(5);
		dataBeanList.add(tempBean);

		return dataBeanList;
	}
}

JRXML-Шаблон

Если сейчас запустить проект с обновлённой заглушкой, то мы получим такой результат:

ireport

Произведём группировку данных по имени студента и по предмету. Для начала удалим секцию Detail 1 – она нам больше не понадобится. Далее вызовем окно для добавления новой группы:

iReport

Выберем имя группы (Studend name) и поле для группировки (name)

iReport

Жмём Next. В большом количестве элементов нет необходимости добавим только header:

iReport

После нажатия Finish повторим те же шаги для создания группы Discipline (для поля discipline, разумеется) и для неё добавим только footer. Должно получится что-то такое:

iReport

Теперь заполним Student name Group Header 1. По аналогии с предыдущей статьёй добавим Text field для name и установим для него рамки. Далее можно оформить содержимое ячейки более броско (цвет фона, размер шрифта, центровка). Стоит обратить внимание, что для того, чтобы выбранный фон был виден надо выбрать флаг Opaque.

iReport

Если полученный на данном этапе шаблон сохранить и запустить генератор, то в полученном отчёте будут не повторяющиеся имена.

Далее вставим в Discipline Group Footer 1 пару Text field для дисциплины и количества пропущенных часов. Можно было заметить, что в предыдущих версиях отчётов содержимое «прилипало» к левой границе ячейки. Сейчас вместо $F{discipline} напишем " "+$F{discipline} и по аналогии для часов пропуска - " "+$F{absence}. Так мы прикрепили строку с пробельным символом слева от названий дисциплин и часов пропусков. Вместо пробельного символа можно вставить другое строковое значение.

iReport

Не забываем добавить границы для ячеек. При сохранении шаблона и генерации появится приемлемый на первый взгляд результат:

iReport

Проблема в том, что при группировке были взяты первые значения для кол-ва часов пропусков, а не их сумма. Для исправления данной проблемы создадим переменные для подсчёта суммы часов по дисциплине и по имени (вторая понадобится для графика).

iReport

Созданную переменную настроим следующим образом:

iReport

И подставим в Text field вместо $F{absence}:

iReport

Если запустить наработку отчёта с текущей версией отчёта, то результат будет правильным.

Теперь создадим похожую переменную для подсчёта пропусков студентов, без привязки к дисциплине:

iReport

Отличие от предыдущей только в имени и группе для сброса значений.
Эту переменную используем для графика. Графики будут располагаться в Summary-секции, добавим её:

iReport

Затем перетащим в неё элемент, соответствующий графику:

iReport

Выберем Pie 3D:

iReport

В качестве параметров зададим имя студента и соответствующую переменную – sumAbsenceByName.

iReport

И сразу же добавим ещё один график (посложнее):

iReport

Грубо говоря, на вкладке Series мы выбираем поле, по которому будут делится столбцы данных (name):

iReport

Далее указываем сумму по какому полю будут представлять столбцы (discipline)  и числовое значение для расчёта этой суммы (переменная sumAbsenceByDiscipline):

  19

Конечный вид шаблона в текстовом виде:

<?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="first_template" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="b72c2c80-9324-4359-a0b4-1feff9ba2ede">
    <property name="ireport.zoom" value="1.0"/>
    <property name="ireport.x" value="0"/>
    <property name="ireport.y" value="0"/>
    <style name="Default" isDefault="true" pdfFontName="./font/ARIAL.TTF" pdfEncoding="Cp1251"/>
    <parameter name="DATE" class="java.util.Date"/>
    <field name="name" class="java.lang.String"/>
    <field name="discipline" class="java.lang.String"/>
    <field name="absence" class="java.lang.Integer"/>
    <variable name="sumAbsenceByDiscipline" class="java.lang.Integer" resetType="Group" resetGroup="Discipline" calculation="Sum">
        <variableExpression><![CDATA[$F{absence}]]></variableExpression>
        <initialValueExpression><![CDATA[0]]></initialValueExpression>
    </variable>
    <variable name="sumAbsenceByName" class="java.lang.Integer" resetType="Group" resetGroup="Student name" calculation="Sum">
        <variableExpression><![CDATA[$F{absence}]]></variableExpression>
        <initialValueExpression><![CDATA[0]]></initialValueExpression>
    </variable>
    <group name="Student name">
        <groupExpression><![CDATA[$F{name}]]></groupExpression>
        <groupHeader>
            <band height="34">
                <textField>
                    <reportElement mode="Opaque" x="0" y="0" width="555" height="34" backcolor="#CCFF99" uuid="2f5d59ad-6924-492a-b5c4-f9705cc23650"/>
                    <box>
                        <topPen lineWidth="1.0"/>
                        <leftPen lineWidth="1.0"/>
                        <bottomPen lineWidth="1.0"/>
                        <rightPen lineWidth="1.0"/>
                    </box>
                    <textElement textAlignment="Center" verticalAlignment="Middle">
                        <font size="14" isBold="true"/>
                    </textElement>
                    <textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
                </textField>
            </band>
        </groupHeader>
    </group>
    <group name="Discipline">
        <groupExpression><![CDATA[$F{discipline}]]></groupExpression>
        <groupFooter>
            <band height="34">
                <textField>
                    <reportElement x="0" y="0" width="396" height="34" uuid="1adc41ce-7c09-46fe-960a-dff145ad7e50"/>
                    <box>
                        <topPen lineWidth="1.0"/>
                        <leftPen lineWidth="1.0"/>
                        <bottomPen lineWidth="1.0"/>
                        <rightPen lineWidth="1.0"/>
                    </box>
                    <textElement verticalAlignment="Middle"/>
                    <textFieldExpression><![CDATA["  "+$F{discipline}]]></textFieldExpression>
                </textField>
                <textField>
                    <reportElement x="396" y="0" width="159" height="34" uuid="7f824851-c67d-41c9-ba98-6ab57aa00d47"/>
                    <box>
                        <topPen lineWidth="1.0"/>
                        <leftPen lineWidth="1.0"/>
                        <bottomPen lineWidth="1.0"/>
                        <rightPen lineWidth="1.0"/>
                    </box>
                    <textElement verticalAlignment="Middle"/>
                    <textFieldExpression><![CDATA["  "+$V{sumAbsenceByDiscipline}]]></textFieldExpression>
                </textField>
            </band>
        </groupFooter>
    </group>
    <title>
        <band height="20" splitType="Stretch">
            <textField>
                <reportElement x="0" y="0" width="555" height="20" uuid="eb16ce83-eea5-4eca-b6a2-c14149019045"/>
                <textFieldExpression><![CDATA[$P{DATE}]]></textFieldExpression>
                <patternExpression><![CDATA["dd.MM.yyyy HH.mm"]]></patternExpression>
            </textField>
        </band>
    </title>
    <summary>
        <band height="351">
            <pie3DChart>
                <chart>
                    <reportElement x="0" y="0" width="555" height="152" uuid="00b94230-eebe-49a6-90e6-a47c7dc6f1d6"/>
                    <chartTitle/>
                    <chartSubtitle/>
                    <chartLegend/>
                </chart>
                <pieDataset>
                    <keyExpression><![CDATA[$F{name}]]></keyExpression>
                    <valueExpression><![CDATA[$V{sumAbsenceByName}]]></valueExpression>
                </pieDataset>
                <pie3DPlot>
                    <plot/>
                    <itemLabel/>
                </pie3DPlot>
            </pie3DChart>
            <stackedBar3DChart>
                <chart>
                    <reportElement x="0" y="152" width="555" height="199" uuid="ff76368e-ef12-44c8-b828-e68534ceb389"/>
                    <chartTitle/>
                    <chartSubtitle/>
                    <chartLegend/>
                </chart>
                <categoryDataset>
                    <categorySeries>
                        <seriesExpression><![CDATA[$F{name}]]></seriesExpression>
                        <categoryExpression><![CDATA[$F{discipline}]]></categoryExpression>
                        <valueExpression><![CDATA[$V{sumAbsenceByDiscipline}]]></valueExpression>
                    </categorySeries>
                </categoryDataset>
                <bar3DPlot>
                    <plot/>
                    <itemLabel/>
                    <categoryAxisFormat>
                        <axisFormat/>
                    </categoryAxisFormat>
                    <valueAxisFormat>
                        <axisFormat/>
                    </valueAxisFormat>
                </bar3DPlot>
            </stackedBar3DChart>
        </band>
    </summary>
</jasperReport>


Конечный результат (отчёт) будет иметь такой вид:

  20

На этом все. Надеюсь, данная статья была полезной.

Если Вам понравилась статья, проголосуйте за нее

Голосов: 6  loading...
admin   capslock270790   kost1k04   GalinaU   stasyan72   slokoz