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
Следующая тема: Группировка данных, выражения

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