Style raportów
JasperReports ma funkcję <style>, która pomaga kontrolować właściwości tekstu w szablonie raportu. Ten element to zbiór ustawień stylów zadeklarowanych na poziomie raportu. Właściwości, takie jak kolor pierwszego planu, kolor tła, czy czcionka jest pogrubiona, kursywa czy normalna, rozmiar czcionki, obramowanie czcionki i wiele innych atrybutów są kontrolowane przez element <style>. Style mogą rozszerzać inne style, a także dodawać lub zastępować właściwości stylu macierzystego.
Właściwości stylu
Element <style> ma wiele atrybutów. Niektóre z najczęściej używanych są wymienione w poniższej tabeli -
S.NO | Atrybut i opis |
---|---|
1 | name Jest obowiązkowe. Musi być unikalny, ponieważ odwołuje się do odpowiedniego stylu raportu w całym raporcie. |
2 | isDefault Wskazuje, czy ten styl jest domyślnym stylem dokumentu. |
3 | style Jest odniesieniem do stylu rodzica. |
4 | mode Określa przezroczystość elementu. Możliwe wartości to Nieprzezroczyste i Przezroczyste . |
5 | forecolor Jest kolorem pierwszego planu obiektu. |
6 | backcolor Jest kolorem tła obiektu. |
7 | fill Określa wzór wypełnienia używany do wypełnienia obiektu. W tej chwili jedyną dozwoloną wartością jest Solid . |
6 | radius Określa promień łuku narożnego prostokąta. |
7 | scaleImage Określa skalę tylko dla obrazów. Możliwe wartości: Clip, FillFrame, RetainShape, RealHeight i RealSize . |
8 | hAlign Określa wyrównanie w poziomie. Możliwe wartości: Left, Center, Right i Justified . |
9 | vAlign Określa wyrównanie w pionie. Możliwe wartości: Top, Middle i Bottom . |
10 | rotation Określa obrót elementu. Możliwe wartości: None, Left, Right i UpsideDown . |
11 | lineSpacing Określa odstępy między wierszami tekstu. Możliwe wartości: Single, 1_1_2, Double . |
12 | markup Określa styl znaczników dla tekstów ze stylami. |
13 | fontName Określa nazwę czcionki. |
14 | fontSize Określa rozmiar czcionki. |
15 | isBold Wskazuje, czy styl czcionki jest pogrubiony. |
16 | isItalic Wskazuje, czy styl czcionki jest kursywą. |
17 | isUnderline Wskazuje, czy styl czcionki jest podkreślony. |
18 | isStrikeThrough Wskazuje, czy styl czcionki jest przekreślony. |
19 | pdfFontName Określa nazwę powiązanej czcionki PDF. |
20 | pdfEncoding Określa kodowanie znaków dla formatu wyjściowego PDF. |
22 | isPdfEmbedded Wskazuje, czy czcionka PDF jest osadzona. |
23 | pattern Określa wzorzec formatu tekstów sformatowanych. |
24 | isBlankWhenNull Wskazuje, czy pusty ciąg (biały znak) powinien być wyświetlany, jeśli wynikiem wyrażenia jest null. |
Style warunkowe
W niektórych sytuacjach styl należy stosować tylko wtedy, gdy spełniony jest określony warunek (na przykład w celu zmiany kolorów sąsiednich wierszy w sekcji szczegółów raportu). Można to osiągnąć za pomocą stylów warunkowych.
Styl warunkowy ma dwa elementy -
- wyrażenie warunkowe typu Boolean
- styl
Styl jest używany tylko wtedy, gdy wynikiem warunku jest prawda .
Stosowanie stylów do elementów raportu
Każdy typ elementu raportu może odwoływać się do definicji stylu raportu za pomocą atrybutu style. Dlatego wszystkie właściwości stylu zadeklarowane w definicji stylu, które mają zastosowanie do bieżącego elementu, zostaną odziedziczone. Aby nadpisać odziedziczone wartości, można użyć właściwości stylu określonych na poziomie elementu raportu.
Szablony stylu
Możemy stworzyć zestaw raportów o wspólnym wyglądzie definiując styl we wspólnym miejscu. Szablony raportów mogą następnie odwoływać się do tego wspólnego szablonu stylu. Szablon stylu to plik XML zawierający jedną lub więcej definicji stylów. Pliki szablonów stylów używane zgodnie z konwencją*.jrtx rozszerzenie, ale nie jest to obowiązkowe.
Szablon stylu zawiera następujące elementy -
<jasperTemplate> - jest to główny element pliku szablonu stylu.
<template> - ten element służy do dołączania odniesień do innych plików szablonów. Zawartość tego elementu jest interpretowana jako lokalizacja wskazanego pliku szablonu.
<styl> - ten element jest identyczny z elementem o tej samej nazwie z szablonów projektów raportów (plików JRXML), z wyjątkiem tego, że styl w szablonie stylu nie może zawierać stylów warunkowych. To ograniczenie jest spowodowane faktem, że style warunkowe obejmują wyrażenia raportu, a wyrażenia mogą być interpretowane tylko w kontekście jednej definicji raportu.
Odniesienia do szablonów stylów są zawarte w raportach JRXML jako elementy <template>. Szablony stylów są ładowane w czasie wypełniania raportu, a odniesienia do nazw stylów są rozwiązywane po załadowaniu wszystkich szablonów. Podczas wczytywania szablonów stylów i przekształcania nazw stylów na style tworzone jest drzewo / wykres szablonów stylów, którego wierzchołek stanowi zestaw stylów zdefiniowanych w raporcie. W tym drzewie odniesienia do nazw stylów są rozwiązywane do ostatniego stylu, który pasuje do nazwy w przechodzeniu do pierwszej głębokości.
Przykład
Wypróbujmy style warunkowe i szablony stylów. Dodajmy <style> element alternateStyledo naszego istniejącego szablonu raportu (Chapter Report Designs ). W zależności od warunku kolor czcionki zmienia się na niebieski, aby uzyskać równomierną liczbę. Dołączyliśmy również szablon stylu"styles.jrtx". Zmieniony szablon raportu (jasper_report_template.jrxml) jest następujący. Zapisz go w katalogu C: \ tools \ jasperreports-5.0.1 \ test -
<?xml version = "1.0"?>
<!DOCTYPE jasperReport PUBLIC
"//JasperReports//DTD Report Design//EN"
"http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<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 = "jasper_report_template" pageWidth = "595"
pageHeight = "842" columnWidth = "515"
leftMargin = "40" rightMargin = "40" topMargin = "50" bottomMargin = "50">
<template>"styles.jrtx"</template>
<style name = "alternateStyle" fontName = "Arial" forecolor = "red">
<conditionalStyle>
<conditionExpression>
<![CDATA[new Boolean($V{countNumber}.intValue() % 2 == 0)]]>
</conditionExpression>
<style forecolor = "blue" isBold = "true"/>
</conditionalStyle>
</style>
<parameter name = "ReportTitle" class = "java.lang.String"/>
<parameter name = "Author" class = "java.lang.String"/>
<queryString>
<![CDATA[]]>
</queryString>
<field name = "country" class = "java.lang.String">
<fieldDescription><![CDATA[country]]></fieldDescription>
</field>
<field name = "name" class = "java.lang.String">
<fieldDescription><![CDATA[name]]></fieldDescription>
</field>
<variable name = "countNumber" class = "java.lang.Integer" calculation = "Count">
<variableExpression><![CDATA[Boolean.TRUE]]></variableExpression>
</variable>
<title>
<band height = "70">
<line>
<reportElement x = "0" y = "0" width = "515" height = "1"/>
</line>
<textField isBlankWhenNull = "true" bookmarkLevel = "1">
<reportElement x = "0" y = "10" width = "515" height = "30"/>
<textElement textAlignment = "Center">
<font size = "22"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$P{ReportTitle}]]>
</textFieldExpression>
<anchorNameExpression><![CDATA["Title"]]></anchorNameExpression>
</textField>
<textField isBlankWhenNull = "true">
<reportElement x = "0" y = "40" width = "515" height = "20"/>
<textElement textAlignment = "Center">
<font size = "10"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$P{Author}]]>
</textFieldExpression>
</textField>
</band>
</title>
<columnHeader>
<band height = "23">
<staticText>
<reportElement mode = "Opaque" x = "0" y = "3"
width = "535" height = "15" backcolor = "#70A9A9" />
<box>
<bottomPen lineWidth = "1.0" lineColor = "#CCCCCC" />
</box>
<textElement />
<text>
<![CDATA[]]>
</text>
</staticText>
<staticText>
<reportElement x = "414" y = "3" width = "121" height = "15" />
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font isBold = "true" />
</textElement>
<text><![CDATA[Country]]></text>
</staticText>
<staticText>
<reportElement x = "0" y = "3" width = "136" height = "15" />
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font isBold = "true" />
</textElement>
<text><![CDATA[Name]]></text>
</staticText>
</band>
</columnHeader>
<detail>
<band height = "16">
<staticText>
<reportElement mode = "Opaque" x = "0" y = "0"
width = "535" height = "14" backcolor = "#E5ECF9" />
<box>
<bottomPen lineWidth = "0.25" lineColor = "#CCCCCC" />
</box>
<textElement />
<text>
<![CDATA[]]>
</text>
</staticText>
<textField>
<reportElement style = "alternateStyle" x = "414" y = "0"
width = "121" height = "15" />
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font size = "9" />
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{country}]]>
</textFieldExpression>
</textField>
<textField>
<reportElement x = "0" y = "0" width = "136" height = "15"
style = "Strong"/>
<textElement textAlignment = "Center" verticalAlignment = "Middle" />
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{name}]]>
</textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
Zawartość szablonu stylu styles.jrtxsą następujące. Zapisz go w katalogu C: \ tools \ jasperreports-5.0.1 \ test.
<?xml version = "1.0"?>
<!DOCTYPE jasperTemplate PUBLIC "-//JasperReports//DTD Template//EN"
"http://jasperreports.sourceforge.net/dtds/jaspertemplate.dtd">
<jasperTemplate>
<style name = "Strong" isBold = "true" pdfFontName = "Helvetica-Bold"
backcolor = "lightGray forecolor = "green"/>
</jasperTemplate>
Kody java do wypełniania raportów pozostają niezmienione. Zawartość plikuC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java są jak podano poniżej -
package com.tutorialspoint;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
public class JasperReportFill {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
String sourceFileName =
"C://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";
DataBeanList DataBeanList = new DataBeanList();
ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();
JRBeanCollectionDataSource beanColDataSource = new
JRBeanCollectionDataSource(dataList);
Map parameters = new HashMap();
/**
* Passing ReportTitle and Author as parameters
*/
parameters.put("ReportTitle", "List of Contacts");
parameters.put("Author", "Prepared By Manisha");
try {
JasperFillManager.fillReportToFile(
sourceFileName, parameters, beanColDataSource);
} catch (JRException e) {
e.printStackTrace();
}
}
}
Zawartość pliku POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java są jak poniżej -
package com.tutorialspoint;
public class DataBean {
private String name;
private String country;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
}
Zawartość pliku C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java są jak poniżej -
package com.tutorialspoint;
import java.util.ArrayList;
public class DataBeanList {
public ArrayList<DataBean> getDataBeanList() {
ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();
dataBeanList.add(produce("Manisha", "India"));
dataBeanList.add(produce("Dennis Ritchie", "USA"));
dataBeanList.add(produce("V.Anand", "India"));
dataBeanList.add(produce("Shrinath", "California"));
return dataBeanList;
}
/**
* This method returns a DataBean object,
* with name and country set in it.
*/
private DataBean produce(String name, String country) {
DataBean dataBean = new DataBean();
dataBean.setName(name);
dataBean.setCountry(country);
return dataBean;
}
}
Generowanie raportów
Skompilujemy i uruchomimy powyższy plik przy użyciu naszego zwykłego procesu budowania ANT. Zawartość pliku build.xml (zapisanego w katalogu C: \ tools \ jasperreports-5.0.1 \ test) jest taka, jak podano poniżej.
Plik importu - baseBuild.xml jest pobierany z rozdziału Konfiguracja środowiska i powinien być umieszczony w tym samym katalogu, co plik build.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewFillReport" basedir = ".">
<import file = "baseBuild.xml" />
<target name = "viewFillReport" depends = "compile,compilereportdesing,run"
description = "Launches the report viewer to preview the
report stored in the .JRprint file.">
<java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
<arg value = "-F${file.name}.JRprint" />
<classpath refid = "classpath" />
</java>
</target>
<target name = "compilereportdesing" description = "Compiles the JXML file and
produces the .jasper file.">
<taskdef name = "jrc" classname = "net.sf.jasperreports.ant.JRAntCompileTask">
<classpath refid = "classpath" />
</taskdef>
<jrc destdir = ".">
<src>
<fileset dir = ".">
<include name = "*.jrxml" />
</fileset>
</src>
<classpath refid = "classpath" />
</jrc>
</target>
</project>
Następnie otwórzmy okno wiersza poleceń i przejdźmy do katalogu, w którym znajduje się plik build.xml. Na koniec wykonaj polecenieant -Dmain-class=com.tutorialspoint.JasperReportFill (domyślnym celem jest viewFullReport) jako -
C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.tutorialspoint.JasperReportFill
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml
clean-sample:
[delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes
[delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jasper
[delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint
compile:
[mkdir] Created dir: C:\tools\jasperreports-5.0.1\test\classes
[javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:28: warning:
'includeantruntime' was not set, defaulting to build.sysclasspath=last;
set to false for repeatable builds
[javac] Compiling 3 source files to C:\tools\jasperreports-5.0.1\test\classes
compilereportdesing:
[jrc] Compiling 1 report design files.
[jrc] log4j:WARN No appenders could be found for logger
(net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
[jrc] log4j:WARN Please initialize the log4j system properly.
[jrc] log4j:WARN See
http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
[jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.
run:
[echo] Runnin class : com.tutorialspoint.JasperReportFill
[java] log4j:WARN No appenders could be found for logger
(net.sf.jasperreports.extensions.ExtensionsEnvironment).
[java] log4j:WARN Please initialize the log4j system properly.
viewFillReport:
[java] log4j:WARN No appenders could be found for logger
(net.sf.jasperreports.extensions.ExtensionsEnvironment).
[java] log4j:WARN Please initialize the log4j system properly.
W wyniku powyższej kompilacji otworzy się okno JasperViewer, jak pokazano na poniższym ekranie -
Tutaj widzimy, że kolor czcionki zmienia się na niebieski dla równej liczby (w kraju kolumny). W nazwie kolumny kolor czcionki jest zmieniany na zielony (odwołanie do tego stylu pochodzi z szablonu stylu).