JasperReports visual styles

Рубрика: JasperReports | 20 March 2007, 10:30 | juriy

JasperReports оформление отчета.

Отчеты, которые я демонстрировал в прошлых заметках, с точки зрения дизайна были довольно примитивными. Мы использовали элементы style, staticText и textField не вдаваясь в детали. В этой заметке я расскажу о том, как настроить внешний вид Jasper отчета.

Все статьи

Разметка страницы.
У корневого элемента jasperReport есть один обязательный атрибут – name, название отчета. Кроме атрибута name есть еще много необязательных атрибутов, с помощью которых можно контролировать разметку страниц (размеры, отступы, и.т.д.) и некоторые другие особенности. Ниже представлена таблица, которая описывает эти атрибуты

Название: pageWidth
Назначение: определяет ширину страницы в пикселях
Значения: любое целое позитивное число
По умолчанию: 595

Название: pageHeight
Назначение: определяет высоту страницы в пикселях
Значения: любое целое позитивное число
По умолчанию: 842

Название: leftMargin
Назначение: определяет размер левого отступа в пикселях
Значения: любое целое позитивное число
По умолчанию: 20

Название: rightMargin
Назначение: определяет размер правого отступа в пикселях
Значения: любое целое позитивное число
По умолчанию: 20

Название: topMargin
Назначение: определяет размер верхнего отступа в пикселях
Значения: любое целое позитивное число
По умолчанию: 20

Название: bottomMargin
Назначение: определяет размер нижнего отступа в пикселях
Значения: любое целое позитивное число
По умолчанию: 20

Название: orientation
Назначение: определяет ориентацию страницы
Значения: Portrait, Landscape
По умолчанию: Portrait

Название: whenNoDataType
Назначение: определяет, какой отчет необходимо создать, если в DataSource’е, который передали в отчет, нет данных
Значения: NoPages – отчет не будет генерироваться вообще. BlankPage – будет сгенерирована одна пустая страница. AllSectionsNoDetail – будут сгенерирован отчет, содержащий все блоки, кроме блока Detail.
По умолчанию: NoPages

Название: isTitleNewPage
Назначение: определяет, следует ли выделять отдельную страницу под блок title.
Значения: true, false
По умолчанию: false

Название: isSummaryNewPage
Назначение: определяет, следует ли выделять отдельную страницу под блок summary.
Значения: true, false
По умолчанию: false

Есть еще и другие атрибуты, но если перечислять их все, то заметка об оформлении отчетов превратится в справочник по элементам шаблона JaserReports. Как видно по описанию, смысл большинства параметров понятен и без разъяснений. Полный список элементов и параметров можно посмотреть в dtd шаблона.

Стили.

Стили позволяют единожды определить некоторый набор свойств элементов, а затем использовать этот набор в любом блоке отчета. Вы знакомы с CSS? Концепции очень похожи. В JasperReports стили действуют точно так же.
С помощью стилей можно указать размер шрифта, цвет текста, указать будет ли текст написан курсивом или будет зачеркнут и еще много других свойств.
Один стиль может наследовать другой: добавлять к определению стиля новые свойства или переопределять существующие.
Про стили можно много говорить, но легче показать один пример:

<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE jasperReport
  PUBLIC "-//JasperReports//DTD Report Design//EN"
  "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">

<jasperReport name="JasperDBDemo">

	<style
		name="Normal"
		isDefault="true"
		pdfFontName="c:\tahoma.ttf"
		pdfEncoding="Cp1251"
	 />

	<style
		name="parent"
		fontSize="14"
		isBold="true"
		pdfFontName="c:\tahoma.ttf"
		pdfEncoding="Cp1251"
	 />

	 <style
	 	name="child"
	 	style="parent"
	 	forecolor="#880000"
	 />
	<detail>
		<band height="100">
			<staticText>
				<reportElement x="180" y="0" width="200" height="20" />
				<text><![CDATA[Это стиль по умолчанию]]></text>
			</staticText>
			<staticText>
				<reportElement x="180" y="20" width="200" height="20" style="parent"/>
				<text><![CDATA[Это стиль parent]]></text>
			</staticText>
			<staticText>
				<reportElement x="180" y="40" width="200" height="20" style="child"/>
				<text><![CDATA[Это стиль child]]></text>
			</staticText>
		</band>
	</detail>
</jasperReport>

Как и следовало ожидать, если стиль не указан явно, то будет использован стиль, назначенный по умолчанию. В нашем примере, это стиль Normal. Параметр стиля Normal isDefault=”true” указывает на то, что именно этот стиль будет использован по умолчанию.
Если же явно указать другой стиль, то будет использован он. Во втором блоке staticText в элементе reportElement указан стиль parent: текст блока будет оформлен в соответствии с этим стилем.
Обратите внимание на стиль child. Он наследует стиль parent (style=”parent”) и переопределяет цвет шрифта на красный (цвет указан в формате #RRGGBB). Все остальные параметры стиля останутся такими же, как у parent.
Можно создать еще один стиль, grandChild, который будет наследовать child и продолжить цепочку.

Думаю, основную “идею” стилей вы уловили.

Ниже приведена небольшая таблица с описанием основных атрибутов тега style:

Название: forecolor
Назначение: определяет цвет шрифта
Значения: 16-ричный код цвета: #RRGGBB или одно из предопределенных значений: blak, blue, cyan, darkGray, gray, green, lightGray, magenta, orange, pink, red, yellow, white

Название: backcolor
Назначение: определяет цвет фона
Значения: см. описание forecolor.

Название: border (leftBorder, rightBorder, topBorder, bottomBorder)
Назначение: определяет размер рамки элемента.
Значения: None, Thin, 1Point, 2Point, 4Point, Dotted

Название: borderColor (leftBorderColor, rightBorderColor, topBorderColor, bottomBorderColor)
Назначение: определяет цвет рамки элемента.
Значения: см. описание forecolor.

Название: padding (leftPadding, rightPadding, topPading, bottomPadding)
Назначение: определяет отступ (в пикселях) между рамкой и элементом
Значения: Целое число

Название: fontName
Назначение: определяет название шрифта
Значения: строка – имя шрифта

Название: fontSize
Назначение: определяет размер шрифта
Значения: число – размер шрифта

Название: isBold
Назначение: определяет, будет ли текст “жирным”
Значения: true, false

Название: isItalic
Назначение: определяет, будет ли текст курсивом
Значения: true, false

Название: isStrikeThrough
Назначение: определяет, будет ли текст зачеркнутым
Значения: true, false

Название: isUnderline
Назначение: определяет, будет ли текст подчеркнутым
Значения: true, false

Название: lineSpacing
Назначение: определяет междустрочный интервал (1_1_2 – это полуторный интервал)
Значения: 1_1_2, Double, Single

Название: rotation
Назначение: определяет на как будет повернут текст
Значения: Left, None, Right, UpsideDown

Название: isStyledText
Назначение: определяет, будет ли текст внутри блока содержать дополнительную информацию о стилях
Значения: true, false

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

Есть еще один способ указывать параметры текста – описывать их в элементе textElement (необязательный подэлмент staticText и textField). На мой взгляд, этот способ не такой гибкий, как использование стилей, но я не исключаю, что бывают ситуации, когда он нужен.

Вот пример использования элемента textElement для форматирования текста

<staticText>
	<reportElement x="0" y="40" width="500" height="20"/>
	<textElement verticalAlignment="Top" textAlignment="Right"/>
	<text><![CDATA[Это пример форматирования с помощью textElement]]></text>
</staticText>

Ниже – список атрибутов textElement:

Название: textAlignment
Назначение: выравнивание текста
Значения: Left, Center, Right, Justified

Название: verticalAlignment
Назначение: вертикальное выранивание
Значения: Top, Middle, Bottom

Название: rotation
Назначение: поворот текста
Значения: None, Left, Right, UpsideDown

Название: lineSpacing
Назначение: междустрочный интервал
Значения: Single, 1_1_2, Double

Название: isStyledText
Назначение: определяет, будет ли текст внутри блока содержать дополнительную информацию о стилях
Значения: true, false

Мы научились указывать стили для блоков staticText и textField. Но что, если требуется выделить другим стилем некоторую часть текста блока? Именно для этого и служит элемент isStyledText, о котором я обещал рассказать дополнительно.
Если указать isStyledText=”true”, то внутри блока textField или staticText можнно указывать дополнительную информацию о стиле фрагмента. Вот пример того, как это работает:

<staticText>
	<reportElement x="0" y="40" width="500" height="60"/>
	<textElement isStyledText="true"/>
	<text><![CDATA[Это
		<style pdfFontName="c:\timesi.ttf" isItalic="true" isUnderline="true">пример</style>
		форматирования с помощью textElement]]></text>
</staticText>

Обратите внимание на pdfFontName – имя шрифта для PDF, при генерации pdf атрибуты вроде isItalic и isBold – будут проигнорированы. Внешний вид шрифта определяется в файле .ttf. и, строго говоря, Tahoma и Tahoma bold это разные шрифты. Таким образом, чтобы сделать pdf с курсивом, необходимо указывать “курсивный” шрифт. Для примера я взял timesi.ttf. С другой стороны для HTML отчета такие “изыски” не обязательны. Аттрибутов isUnderline и isStrikeThrough эти ограничения не касаются – чтобы создать соответствующий эффект достаточно провести линию: “под” или “через” текст, соответственно. Начертание самого шрифта не меняется, поэтому указывать pdfFontName не нужно.

Установка фона для отчета.
Бывают ситуации, когда необходимо установить фон – логотип компании или водяной знак “конфиденциально”. Реализовать эту задачу можно, воспользовавшись тегом “background”.
Замечание: установка фона никак не отразится на отчетах, проэкспортированных в HTML и в xls. Эти форматы не поддерживают фоновых изображений. Очевидно, что для форматов plain text и csv большинство “стилистических изысков” тоже не пригодится.
Вот пример кода, который показывает, как добавить фон:

<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE jasperReport
  PUBLIC "-//JasperReports//DTD Report Design//EN"
  "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">

<jasperReport name="JasperDBDemo">

	<style
		name="Normal"
		isDefault="true"
		forecolor="#880000"
		pdfFontName="reports\fonts\tahoma.ttf"
		pdfEncoding="Cp1251"
	 />

	 <style
	 	style="Normal"
	 	name="bg"
	 	fontSize="50"
	 	forecolor="lightGray"
	  />

	<background>
		<band height="780">
			<staticText>
				<reportElement x="150" y="0" width="500" height="780"
				mode="Transparent" style="bg"/>
				<text><![CDATA[СЕКРЕТНО]]></text>
			</staticText>
		</band>
	</background>

	<detail>
		<band height="100">
			<staticText>
				<reportElement x="230" y="40" width="100" height="60"/>
				<box border="Thin" />
				<text><![CDATA[Текст отчета]]></text>
			</staticText>
		</band>
	</detail>
</jasperReport>

Забегая немного вперед, хочется показать, как вставить изображение на фон отчета. Синтаксис понятен интуитивно:

<background>
	<band height="780">
		<image>
			<reportElement x="0" y="0" width="500" height="780"
			mode="Transparent"/>
			<imageExpression class="java.lang.String">
				"reports/images/logo.png"
			</imageExpression>
		</image>
	</band>
</background>

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

Предыдущая тема: Интеграция Ant
Следующая тема: Группировка данных, выражения

Комментариев: 5

5 Responses to “JasperReports visual styles”

Комментарии:

  1. Andrey

    Привет.
    Помогите решить проблему!
    при экспорте отчета в Excel все стили просто выключаются. Хотя бы возьмите файл StyledTextReport.jrxml который поставляется с дистрибутивом JasperReport в папке demo\samples\styledtext экспорт в PDF все стили есть а экспорт в Excel все стили просто выключаются.
    заранее благодарю

  2. Rita

    Здравствуйте!
    Поскажите пожалуйста, можно ли вместо белого листа, на котором выводится отчет для просмотра, накладывать его на определенный фон (фон с гербом, например)?

  3. Aleksandr

    Подскажите пожалуйста.
    Нужно раскрасить ячейку, где цвет зависит от значения которое будет отображаться в этом поле. Догадываюсь что такое возможно, но никак не могу найти где нибудь, как это делается.
    Спасибо

  4. Nikita

    Здравствуйте! Объясните пожалуйста в чем проблема: Есть отчет который должен экспортироваться в Word и PDF. Так вот когда экспорт идет в PDF, отчет рисуется отлично, но когда экспорт идет в Word то у таблицы не рисуются некоторые границы, причем если открывать Libre Office и Microsoft Word то не нарисованные границы отличаются.
    Буду очень признателен.

Leave a Reply