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

Вы можете подписаться на RSS ленту новых тестов сервиса Quizful, в том числе и отдельно по каждой категории

Лента обновлений
ссылка 15:04:55
Комментарий от Artale:
"2 - всё правильно, постфиксный и префиксный инкремент на...
ссылка Oct 16 19:36
Добавлен вопрос в тест HTML - Средний уровень
ссылка Oct 16 11:43
Комментарий от AlexFurm:
Ответы неправильные на данный момент указаны, правильны...
ссылка Oct 15 20:20
Комментарий от dafed000:
Я тоже решила, что 6 mod 11 = 5, но меня смущало, что д...
ссылка Oct 15 19:41
Комментарий от kate2601:
В конструктор класса Boolean можно передавать строку и ...
Статистика

Тестов: 153, вопросов: 8596. Пройдено: 442988 / 2175562.

JasperReports & iReport. Часть 2

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

Предисловие

Данная статья является продолжением статьи JasperReports & iReport. В этой статье почти не будет Java, поближе рассмотрим 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