JasperReports - Szybki przewodnik

Co to jest raport

Raport to znacząca, dobrze zdefiniowana i podsumowana prezentacja informacji. Zwykle rutynowe czynności są zautomatyzowane, a dane podsumowywane w „Raportach” wspomagających podejmowanie decyzji. Raporty przedstawiają zwykłe nieporządne dane w wykresach, grafach i innych formach reprezentacji graficznych.

Szablon raportu

Generalnie, do generowania raportów przez większość narzędzi do generowania raportów handlowych przyjęto następujący układ.

TYTUŁ
NAGŁÓWEK
COLUMNHEADER
SZCZEGÓŁ
COLUMNFOOTER
STOPKA STONY
PODSUMOWANIE

Poniżej znajdują się opisy każdego elementu wymienionego na schemacie -

S.NO Element i opis
1

title

Tytuł zawiera „Tytuł” ​​raportu. Pojawia się tylko raz na samym początku raportu, na przykład „Raport dotyczący punktów samouczka”.

2

pageHeader

PageHeader może zawierać informacje o dacie i godzinie i / lub nazwę organizacji. Pojawia się u góry każdej strony.

3

columnHeader

ColumnHeader zawiera nazwy tych konkretnych pól, które chcesz wyświetlić w raporcie, na przykład „Nazwisko autora”, „Godzina rozpoczęcia”, „Godzina końcowa”, „Przepracowane godziny”, „Data” itp.

4

detail

Szczegóły to część, w której wyświetlane są wpisy określonych pól (wymienionych w nagłówku kolumny), na przykład „Manisha”, „9:00”, „18:00”, „9”, „10.02.2013”.

5

columnFooter

ColumnFooter może wyświetlać podsumowanie dowolnego pola, na przykład „Całkowita liczba przepracowanych godzin:„ 180 ”.

6

pageFooter

PageFooter może zawierać informacje o liczbie stron. Znajduje się na dole każdej strony, na przykład „1/23”.

7

summary

Podsumowanie zawiera informacje wywnioskowane z części „szczegółowej”, na przykład po wyszczególnieniu liczby godzin przepracowanych przez każdego autora, całkowitą liczbę godzin przepracowanych przez każdego autora można umieścić na wykresie wizualnym, takim jak wykres kołowy, wykres itp. Dla lepszego porównania.

JasperReports

Poniżej przedstawiono typowe problemy napotykane podczas opracowywania raportu -

  • Core changes - Zazwyczaj odzwierciedlają zmiany biznesowe lub ulepszenia wymagane do zmiany podstawowej logiki raportu.

  • Results exporting - Istnieje wiele formatów, do których można wyeksportować raport, takich jak: HTML, tekst, PDF, MS Excel, RTF, ODT, wartości rozdzielane przecinkami, XML lub obraz.

  • Complicated reports - raporty podrzędne i raporty z zakładkami są dobrym przykładem.

  • Charts reports - Wykresy wizualne, na przykład wykres, wykres kołowy, linia XY, słupek, miernik i szeregi czasowe.

Aby usunąć narzut wyżej wymienionych punktów i ułatwić proces raportowania, wprowadzono wiele frameworków, narzędzi, bibliotek i aplikacji firm trzecich. JasperReports jest jednym z nich.

JasperReportsto mechanizm raportowania java typu open source. Jest oparty na Javie i nie ma własnej składni wyrażeń. JasperReports ma możliwość dostarczania bogatych treści na ekran, do drukarki lub do plików PDF, HTML, XLS, RTF, ODT, CSV, TXT i XML. Ponieważ nie jest to samodzielne narzędzie, nie można go zainstalować samodzielnie. Zamiast tego jest osadzany w aplikacjach Java poprzez dołączenie swojej biblioteki do CLASSPATH aplikacji.

JasperReports to biblioteka klas Java i nie jest przeznaczona dla użytkowników końcowych, ale jest raczej skierowana do programistów Java, którzy muszą dodać funkcje raportowania do swoich aplikacji.

Funkcje JasperReports

Niektóre z istotnych cech JasperReports to -

  • Posiada elastyczny układ raportu.

  • Może przedstawiać dane tekstowo lub graficznie.

  • Programiści mogą dostarczać dane na wiele sposobów.

  • Może akceptować dane z wielu źródeł danych.

  • Może generować znaki wodne (znak wodny jest podobny do obrazu wtórnego nałożonego na obraz główny).

  • Może generować raporty podrzędne.

  • Jest w stanie eksportować raporty w różnych formatach.

JasperReports to czysta biblioteka Java, a nie samodzielna aplikacja. Nie może działać samodzielnie, dlatego musi być osadzony w innej aplikacji Java po stronie klienta lub serwera. Ponieważ jest oparty na języku Java, można go uruchomić na dowolnej platformie obsługującej język Java (JDK 1.3 i nowsze). Wszystkie funkcje JasperReport są zebrane w jednym pliku JAR, jasperreports-xxxjar. Ten plik JAR wraz z wymaganymi i opcjonalnymi bibliotekami (plik .ZIP) można pobrać z witryny: JasperReport Library Link . Pobierz najnowszą wersję z tego łącza.

Plik ZIP zawiera plik JAR JasperReports wraz z kodem źródłowym JasperReports, zależnymi plikami JAR i wieloma przykładami demonstrującymi funkcje JasperReport.

JasperReport Environment

Aby rozpocząć tworzenie raportów, musimy przygotować gotowe środowisko. Rozpakuj pobrany plik JasperReport.ZIP do dowolnej lokalizacji (w naszym przypadku rozpakowaliśmy go do C: \ tools \ jasperreports-5.0.1). Struktura katalogów wyodrębnionego pliku jest taka sama, jak pokazano poniżej -

Oto szczegóły wszystkich katalogów -

  • build - zawiera skompilowane pliki klas JasperReport.

  • demo - zawiera różne przykłady demonstrujące kilka aspektów funkcjonalności JasperReports.

  • dist - zawiera plik jasperreports-xxxjar. Dodamy ten plik JAR do naszej CLASSPATH, aby skorzystać z JasperReports.

  • docs - zawiera lokalną kopię dokumentacji JasperReports.

  • lib - zawiera wszystkie potrzebne pliki JAR, zarówno do tworzenia JasperReports, jak i do używania ich w naszych aplikacjach.

  • src - zawiera kod źródłowy JasperReports.

  • build.xml - plik kompilacji ANT do budowania kodu źródłowego JasperReports. Jeśli nie zamierzamy modyfikować JasperReports, nie musimy używać tego pliku, ponieważ JasperReports jest rozpowszechniany w skompilowanej formie.

  • changes.txt - dokument tekstowy wyjaśniający różnice między aktualną i poprzednią wersją biblioteki klas JasperReports.

  • license.txt - dokument tekstowy zawierający pełny tekst licencji LGPL (Lesser General Public License).

  • readme.txt - dokument tekstowy zawierający instrukcje dotyczące budowania i wykonywania dostarczonych przykładów.

Zasadniczo do generowania raportów używamy tylko jasperreports-xxxjar w dist i JAR w katalogu lib . Ponieważ JasperReports jest narzędziem open source, jeśli jakakolwiek usterka lub błąd zostanie rozpoznany podczas wykonywania w jasperreports-xxxjar, możemy to naprawić i ponownie zbudować JAR za pomocą pliku build.xml.

Ustaw CLASSPATH

Aby korzystać z JasperReport, musimy ustawić następujące pliki na naszą CLASSPATH -

  • jasperreports-xxxjar, gdzie xxx to wersja JasperReports. Znaleziono to w katalogu C: \ tools \ jasperreports-xxx \ dist).

  • Wszystkie pliki JAR w podkatalogu lib (C: \ tools \ jasperreports-xxx \ lib).

W czasie instalacji korzystaliśmy z JasperReport w wersji 5.0.1. Kliknij prawym przyciskiem myszy „Mój komputer” i wybierz „Właściwości”, a następnie kliknij przycisk „Zmienne środowiskowe” w zakładce „Zaawansowane”. Teraz zaktualizuj zmienną „Path” o toC:\tools\jasperreports-5.0.1\dist\jasperreports-5.0.1.jar:C:\tools\jasperreports-5.0.1\lib. Teraz jesteś gotowy do tworzenia raportów.

We wszystkich przykładach w tym samouczku do generowania raportów używaliśmy zadań ANT. Plikbuilddba o zaimportowanie wszystkich wymaganych plików JAR do generowania raportów. Dlatego ustawienie CLASSPATH, jak wspomniano powyżej, pomoże tylko tym, którzy chcą generować raporty bez użycia ANT.

Konfiguracja kompilacji

Wszystkie przykłady w tym samouczku -

  • zostały napisane przy użyciu prostego edytora tekstu.

  • zostały zapisane w katalogu C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint.

  • zostały skompilowane i wykonane z wiersza poleceń przy użyciu Apache ANT. Użyjemy plikubaseBuild.xml plik, który zaimportujemy w ANT build.xmlplik w kolejnych rozdziałach. Zapisz ten plik w C: \ tools \ jasperreports-5.0.1 \ test. Poniżej znajduje się zawartość pliku baseBuild.xml -

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportExample" basedir = ".">
   <description>Previews our JasperReport XML Design</description>
   <property name = "file.name" value = "jasper_report_template" />
   
   <!-- Directory where the JasperReports project file was extracted
   needs to be changed to match the local environment -->
   <property name = "jasper.dir" value = "../" />
   <property name = "dist.dir" value = "${jasper.dir}/dist" /> <property name = "lib.dir" value = "${jasper.dir}/lib" />
   <property name = "src.dir" value = "src" />
   <property name = "classes.dir" value = "classes" />
   <property name = "main-class" value = "com.tutorialspoint.HelpMe" />

   <path id = "classpath">
      <pathelement location = "./" />
      <pathelement location = "${classes.dir}" /> <fileset dir = "${lib.dir}">
         <include name = "**/*.jar" />
      </fileset>
	  
      <fileset dir = "${dist.dir}"> <include name = "**/*.jar" /> </fileset> </path> <target name = "compile" depends = "clean-sample"> <mkdir dir = "${classes.dir}"/>
		
      <javac srcdir = "${src.dir}" destdir = "${classes.dir}" 
         classpathref = "classpath" />
   </target>
   
   <target name = "run" depends = "compile">
      <echo message = "Running class : ${main-class}"/> <java fork = "true" classname = "${main-class}">
         <classpath>
            <path refid = "classpath" />
         </classpath>
      </java>
   </target>
   
   <target name = "clean-sample">
      <delete dir = "${classes.dir}" /> <delete file = "./${file.name}.jasper" />
      <delete file = "./${file.name}.jrprint" />
   </target>
   
</project>

Ten plik ma wszystkie wymagane cele, takie jak czyszczenie katalogów, kompilowanie plików java i wykonywanie plików klas.

Poniżej znajdują się szczegóły wymienione w różnych katalogach w baseBuild.xml. Zakładając, że bieżący katalog to C: \ tools \ jasperreports-5.0.1 \ test) -

  • jasper.dir - to katalog C: \ tools \ jasperreports-5.0.1

  • lib.dir - to katalog C: \ tools \ jasperreports-5.0.1 \ lib

  • src.dir - to C: \ tools \ jasperreports-5.0.1 \ test \ src

  • classes.dir - to C: \ tools \ jasperreports-5.0.1 \ test \ classes

  • main-class - com.tutorialspoint.HelpMe. Ta klasa jest prostą klasą wykonywaną, gdy żadna nazwa pliku klasy nie jest przekazywana z wiersza poleceń. Zapisz ten plik w C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint.

package com.tutorialspoint;

public class HelpMe {
   public static void main(String[] args) {
      System.out.println("This is the default class executed."
         + "Please pass the fully qualified class" + " name to be executed as command line"
         + " parameter, for example," + " com.tutorialspoint.HelpMe ");
   }
}

Klasy Jasper Managers

Istnieje wiele klas, które zostaną wykorzystane do skompilowania projektu raportu JRXML, wypełnienia raportu, wydrukowania raportu, eksportu do plików PDF, HTML i XML, przeglądania wygenerowanych raportów i projektowania raportów.

Lista tych klas to -

  • net.sf.jasperreports.engine.JasperCompileManager - służy do kompilowania szablonu raportu JRXML.

  • net.sf.jasperreports.engine.JasperFillManager - służy do wypełniania raportu danymi ze źródła danych.

  • net.sf.jasperreports.engine.JasperPrintManager - Służy do drukowania dokumentów wygenerowanych przez bibliotekę JasperReports.

  • net.sf.jasperreports.engine.JasperExportManager - Służy do uzyskiwania zawartości PDF, HTML lub XML dla dokumentów utworzonych w procesie wypełniania raportów.

  • net.sf.jasperreports.view.JasperViewer - reprezentuje prostą aplikację Java Swing, która może ładować i wyświetlać raporty.

  • net.sf.jasperreports.view.JasperDesignViewer - używany w czasie projektowania do przeglądania szablonów raportów.

Konfigurowanie Apache ANT

Zamierzamy zbudować wszystkie przykłady przy użyciu Apache ANT. Więc uprzejmie sprawdź rozdział ANT - Konfiguracja środowiska, aby skonfigurować Apache ANT w swoim systemie.

Głównym celem JasperReports jest tworzenie zorientowanych na strony, gotowych do druku dokumentów w prosty i elastyczny sposób. Poniższy schemat blokowy przedstawia typowy przepływ pracy podczas tworzenia raportów.

Jak pokazano na ilustracji, cykl życia składa się z różnych faz -

  • Projektowanie raportu - w tym kroku tworzymy plik JRXML, który jest dokumentem XML zawierającym definicję układu raportu. Możemy użyć dowolnego edytora tekstu lub iReportDesigner, aby go ręcznie utworzyć. Jeśli używany jest iReportDesigner, układ jest projektowany w sposób wizualny, stąd rzeczywista struktura JRXML może zostać zignorowana.

  • Kompilowanie raportu - na tym etapie JRXML jest kompilowany w obiekcie binarnym zwanym plikiem Jasper (* .jasper). Ta kompilacja została wykonana ze względu na wydajność. Pliki Jasper są tym, co musisz dostarczyć wraz z aplikacją, aby uruchamiać raporty.

  • Wykonanie raportu (wprowadzenie danych do raportu) - W tym kroku dane z aplikacji są wypełniane w skompilowanym raporcie. Klasa net.sf.jasperreports.engine.JasperFillManager udostępnia niezbędne funkcje do wypełniania danych w raportach. Tworzony jest plik wydruku Jasper (* .jrprint), którego można użyć do wydrukowania lub wyeksportowania raportu.

  • Eksportowanie raportu do żądanego formatu - W tym kroku możemy wyeksportować plik wydruku Jasper utworzony w poprzednim kroku do dowolnego formatu za pomocą JasperExportManager. Ponieważ Jasper zapewnia różne formy eksportu, a zatem przy tych samych danych wejściowych, możemy tworzyć wiele reprezentacji danych.

Szczegółowy przegląd każdego z powyższych kroków zostanie podany w kolejnych rozdziałach.

Szablony JRXML (lub pliki JRXML) w JasperReport to standardowe pliki XML z rozszerzeniem .jrxml. Wszystkie pliki JRXML zawierają znacznik <jasperReport> jako element główny. To z kolei zawiera wiele elementów podrzędnych (wszystkie są opcjonalne). Framework JasperReport może obsługiwać różne rodzaje źródeł danych. W tym samouczku pokażemy, jak wygenerować podstawowy raport, po prostu przekazując zbiór obiektów danych Java (przy użyciu ziaren Java) do JasperReport Engine. Raport końcowy będzie zawierał listę osób wraz z kategoriami, w tym ich nazwiskami i krajami.

W tym rozdziale omówiono następujące kroki, aby opisać - jak zaprojektować JasperReport -

  • Tworzenie szablonu raportu JRXML i.
  • Podgląd szablonu raportu XML.

Tworzenie szablonu raportu JRXML

Utwórz plik JRXML, którym jest jasper_report_template.jrxmlużywając edytora tekstu i zapisz ten plik w C: \ tools \ jasperreports-5.0.1 \ test zgodnie z naszą konfiguracją środowiska.

<?xml version = "1.0" encoding = "UTF-8"?>
<!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" language = "groovy" pageWidth = "595"
   pageHeight = "842" columnWidth = "555" leftMargin = "20" rightMargin = "20"
   topMargin = "20" bottomMargin = "20">
  
   <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>
	
   <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 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" />
            <textElement textAlignment = "Center" verticalAlignment = "Middle" />
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{name}]]>
            </textFieldExpression>
         </textField>

      </band>
   </detail>
	
</jasperReport>

Oto szczegóły głównych pól w powyższym szablonie raportu -

  • <queryString> - to jest puste (ponieważ przekazujemy dane przez Java Beans). Zwykle zawiera instrukcję SQL, która pobiera wynik raportu.

  • <nazwa pola> - ten element służy do mapowania danych ze źródeł danych lub zapytań na szablony raportów. name jest ponownie używany w treści raportu i rozróżniana jest wielkość liter.

  • <fieldDescription> - ten element odwzorowuje nazwę pola na odpowiedni element w pliku XML.

  • <staticText> - definiuje tekst statyczny, który nie zależy od żadnych źródeł danych, zmiennych, parametrów ani wyrażeń raportu.

  • <textFieldExpression> - definiuje wygląd pola wynikowego.

  • $ F {country} - jest to zmienna zawierająca wartość wyniku, predefiniowane pole w tagu <nazwa pola>.

  • <band> - Wstęgi zawierają dane, które są wyświetlane w raporcie.

Gdy projekt raportu będzie gotowy, zapisz go w katalogu C: \.

Podgląd szablonu raportu XML

W pliku JAR JasperReports dostępne jest narzędzie net.sf.jasperreports.view.JasperDesignViewer , które pomaga w wyświetlaniu podglądu projektu raportu bez konieczności jego kompilacji lub wypełniania. To narzędzie jest samodzielną aplikacją Java, dlatego można je uruchomić za pomocą ANT.

Napiszmy cel ANT viewDesignXMLaby wyświetlić JRXML. Stwórzmy więc i zapiszmybuild.xmlw katalogu C: \ tools \ jasperreports-5.0.1 \ test (powinien być umieszczony w tym samym katalogu, w którym znajduje się JRXML). Oto plik build.xml -

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewDesignXML" basedir = ".">

   <import file = "baseBuild.xml" />
   <target name = "viewDesignXML" description = "Design viewer is 
      launched to preview the JXML report design.">
      
      <java classname = "net.sf.jasperreports.view.JasperDesignViewer" fork = "true">
         <arg value = "-XML" />
         <arg value = "-F${file.name}.jrxml" />
         <classpath refid = "classpath" />
      </java>
   </target>

</project>

Następnie otwórzmy wiersz poleceń i przejdźmy do katalogu, w którym znajduje się plik build.xml. Wykonaj polecenieant(Ponieważ viewDesignXML jest domyślnym celem). Wynik jest następujący -

C:\tools\jasperreports-5.0.1\test>ant
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml

viewDesignXML:
[java] log4j:WARN No appenders could be found for logger
(net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
[java] log4j:WARN Please initialize the log4j system properly.

Ostrzeżenie Log4j można zignorować i w wyniku powyższego wykonania otworzy się okno z etykietą „JasperDesignViewer”, w którym zostanie wyświetlony podgląd naszego szablonu raportu.

Jak widzimy, wyświetlane są tylko wyrażenia raportu służące do uzyskiwania danych, ponieważ JasperDesignViewer nie ma dostępu do rzeczywistego źródła danych ani parametrów raportu. Zakończ JasperDesignViewer, zamykając okno lub naciskając Ctrl-c w oknie wiersza poleceń.

Wygenerowaliśmy szablon JasperReport (plik JRXML) w poprzednim rozdziale. Tego pliku nie można używać bezpośrednio do generowania raportów. Musi być skompilowany do natywnego formatu binarnego JasperReport o nazwieJasperplik. Podczas kompilacji przekształcamy obiekt JasperDesign w obiekt JasperReport -

Interfejs net.sf.jasperreports.engine.design.JRCompiler odgrywa kluczową rolę podczas kompilacji. Ten interfejs ma kilka implementacji w zależności od języka używanego do wyrażeń raportów, które mogą być napisane w Javie, Groovy, JavaScript lub dowolnym innym języku skryptowym, o ile implementacja kompilatora może go ocenić w czasie wykonywania.

Możemy skompilować plik JRXML na dwa sposoby -

  • Kompilacja programowa.
  • Kompilacja za pomocą zadania ANT.

Programowa kompilacja JRXML

JasperReports API oferuje klasę fasady net.sf.jasperreports.engine.JasperCompileManager do kompilowania JasperReport. Ta klasa składa się z kilku publicznych statycznych metod kompilowania szablonów raportów. Źródłem szablonów mogą być pliki, strumienie wejściowe i / lub obiekty pamięci.

Zawartość pliku JRXML (jasper_report_template.jrxml) jest następująca. Jest zapisywany w kataloguC:\tools\jasperreports-5.0.1\test -

<?xml version = "1.0" encoding = "UTF-8"?>
<!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" language = "groovy" pageWidth = "595"
   pageHeight = "842" columnWidth = "555" leftMargin = "20" rightMargin = "20"
   topMargin = "20" bottomMargin = "20">

   <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>
   
   <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 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" />
            <textElement textAlignment = "Center" verticalAlignment = "Middle" />
               
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{name}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </detail>
	
</jasperReport>

Poniższy kod demonstruje kompilację powyższego pliku jasper_report_template.jrxml .

package com.tutorialspoint;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;

public class JasperReportCompile {

   public static void main(String[] args) {
      String sourceFileName = "C://tools/jasperreports-5.0.1/test" + 
         "/jasper_report_template.jrxml";

      System.out.println("Compiling Report Design ...");
      try {
          /**
          * Compile the report to a file name same as
          * the JRXML file name
          */
         JasperCompileManager.compileReportToFile(sourceFileName);
      } catch (JRException e) {
         e.printStackTrace();
      }
      System.out.println("Done compiling!!! ...");
   }
}

Kompilacja szablonów

W następnym kroku zapiszmy powyższą zawartość w pliku C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportCompile.javai zaimportuj baseBuild.xml do pliku build.xml, jak poniżej. BaseBuild.xml ma już rozszerzeniecompile i run cele -

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "run" basedir = ".">

   <import file = "baseBuild.xml"/>

</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.JasperReportCompile jako -

C:\tools\jasperreports-5.0.1\test>ant -Dmain-class = com.tutorialspoint.JasperReportCompile
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml
compile:
   [javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:27:
   warning: 'includeantruntime' was not set, defaulting to
   build.sysclasspath=last;set to false for repeatable builds
   [javac] Compiling 1 source file to C:\tools\jasperreports-5.0.1\test\classes

run:
   [echo] Runnin class : com.tutorialspoint.JasperReportCompile
   [java] Compiling Report Design ...
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
   [java] log4j:WARN Please initialize the log4j system properly.
   [java] Done compiling!!! ...

BUILD SUCCESSFUL
Total time: 8 seconds

W wyniku powyższej kompilacji zobaczysz, że plik szablonu jasper_report_template.jasper został wygenerowany w katalogu C: \ tools \ jasperreports-5.0.1 \ test.

Podgląd skompilowanego szablonu raportu

Net.sf.jasperreports.view.JasperDesignViewer może być używany do podglądu skompilowany szablonów raportów i szablonów JRXML.

Aby przejść dalej, dodajmy nowy cel viewDesigndo powyższego pliku build.xml, który pozwoli nam na podgląd skompilowanego raportu. Poniżej znajduje się poprawiony plik build.xml -

Plik importu - baseBuild.xml jest pobierany z rozdziału Konfiguracja środowiska i powinien być umieszczony w tym samym katalogu co build.xml.

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewDesign" basedir = ".">

   <import file = "baseBuild.xml" />
   <target name = "viewDesign" description="Design viewer is launched 
      to preview the compiled report design.">
      
      <java classname = "net.sf.jasperreports.view.JasperDesignViewer" fork = "true">
         <arg value = "-F${file.name}.jasper" />
         <classpath refid = "classpath" />
      </java>
   </target>

</project>

Wykonajmy polecenie - ant(domyślnym celem jest viewDesign) w wierszu polecenia. Otworzy się okno JasperDesignViewer, wyświetlając plik Jasper, jak poniżej -

Kompilacja za pomocą zadania ANT

Ponieważ kompilacja szablonów raportów jest bardziej jak zadanie czasu projektowania niż zadanie w czasie wykonywania, biblioteka JasperReport ma niestandardowe zadanie ANT. W niektórych sytuacjach, gdy plik JRXML jest tworzony w czasie wykonywania, nie możemy użyć tego zadania ANT. Niestandardowe zadanie ANT nosi nazwę JRC i jest implementowane przez klasę: net.sf.jasperreports.ant.JRAntCompileTask . Jego składnia i zachowanie są bardzo podobne do wbudowanego<javac> Zadanie ANT.

Kompilacja szablonów

Dodajmy nowy cel compilereportdesingdo naszego istniejącego pliku build.xml. Tutaj folder źródłowy jest określony za pomocą zagnieżdżonego znacznika <src> z zestawami plików. Zagnieżdżony znacznik źródłowy umożliwia kompilowanie szablonów raportów, które są rozproszone w wielu różnych lokalizacjach i nie są zgrupowane w jednym głównym folderze źródłowym raportów. Poniżej znajduje się poprawiony plik build.xml -

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "compilereportdesing" basedir = ".">
   
   <import file = "baseBuild.xml" />
   <target name = "viewDesign" description = "Design viewer is 
      launched to preview the compiled report design.">
      
      <java classname = "net.sf.jasperreports.view.JasperDesignViewer" fork = "true">
         <arg value = "-F${file.name}.jasper" />
         <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 wiersz poleceń i przejdźmy do katalogu, w którym znajduje się plik build.xml. Wykonaj polecenieant(compilereportdesing jest domyślnym celem); Dane wyjściowe są następujące -

C:\tools\jasperreports-5.0.1\test>ant
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml

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.

BUILD SUCCESSFUL
Total time: 5 seconds

Plik jasper_report_template.jasper jest generowany w systemie plików (w naszym przypadku katalog C: \ tools \ jasperreports-5.0.1 \ test). Ten plik jest identyczny z plikiem wygenerowanym programowo przez wywołanie metody net.sf.jasperreports.engine.JasperCompileManager.compileReportToFile (). Możemy wyświetlić podgląd tego pliku jasper, wykonującant viewDesign.

Głównym celem każdego narzędzia raportowania jest tworzenie wysokiej jakości dokumentów. Proces wypełniania raportów pomaga narzędziu raportowania osiągnąć to poprzez manipulowanie zbiorami danych.

Główne dane wejściowe wymagane do procesu wypełniania raportów to -

  • Report Template - To jest rzeczywisty plik JasperReport.

  • Report Parameters- Są to w zasadzie nazwane wartości, które są przekazywane do silnika w czasie wypełniania raportu. Omówimy je w rozdziale Parametry raportu .

  • Data Source- Możemy wypełnić plik Jasper z szeregu źródeł danych, takich jak zapytanie SQL, plik XML, plik csv, zapytanie HQL (Hibernate Query Language), zbiór Java Beans itp. Zostanie to szczegółowo omówione w raporcie Rozdział Źródła danych .

Dane wyjściowe generowane przez ten proces to plik .jrprint dokument gotowy do przeglądania, drukowania lub eksportowania do innych formatów. Klasa fasady net.sf.jasperreports.engine.JasperFillManager jest zwykle używana do wypełniania danych szablonu raportu. Ta klasa ma różne metody fillReportXXX () , które wypełniają szablony raportów (szablony mogą znajdować się na dysku, pobierane ze strumieni wejściowych lub dostarczane bezpośrednio w pamięci).

W tej klasie fasady istnieją dwie kategorie metod fillReportXXX () -

  • Pierwszy typ otrzymuje obiekt java.sql.Connection jako trzeci parametr. W większości przypadków raporty są wypełnione danymi z relacyjnej bazy danych. Osiąga się to poprzez -

    • Połącz się z bazą danych przez JDBC.

    • Dołącz zapytanie SQL do szablonu raportu.

    • Silnik JasperReports wykorzystuje przekazane połączenie i wykonuje zapytanie SQL.

    • W ten sposób tworzone jest źródło danych raportu do wypełnienia raportu.

  • Drugi typ to obiekt net.sf.jasperreports.engine.JRDataSource, gdy dane do wypełnienia są dostępne w innej formie.

Szablony raportów wypełnienia

Napiszmy szablon raportu. Zawartość pliku JRXML (C: \ tools \ jasperreports-5.0.1 \ test \ jasper_report_template.jrxml) jest jak poniżej -

<?xml version = "1.0" encoding = "UTF-8"?>
<!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" language = "groovy" pageWidth = "595"
   pageHeight = "842" columnWidth = "555" leftMargin = "20" rightMargin = "20"
   topMargin = "20" bottomMargin = "20">

   <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>

   <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 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" />
            <textElement textAlignment = "Center" verticalAlignment = "Middle" />
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{name}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </detail>
	
</jasperReport>

Następnie przekażmy zbiór obiektów danych Java (ziaren Java) do JasperReport Engine, aby wypełnić skompilowany raport.

Napisz POJO DataBean.java, który reprezentuje obiekt danych (komponent bean Java). Ta klasa definiuje dwa obiekty typu String, tj. „Name” i „country”. Zapisz go w kataloguC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint.

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;
   }
}

Napisz klasę DataBeanList.java, która ma logikę biznesową do generowania kolekcji obiektów java bean. Jest to dalej przekazywane do silnika JasperReports w celu wygenerowania raportu. Tutaj dodajemy 4 obiekty DataBean do listy. Zapisz go w kataloguC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint.

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;
   }
}

Napisz główny plik klasy JasperReportFill.java, który pobiera kolekcję java bean z klasy (DataBeanList) i przekazuje ją do silnika JasperReports w celu wypełnienia szablonu raportu. Zapisz go w kataloguC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint.

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();
      try {
         JasperFillManager.fillReportToFile( 
            sourceFileName, parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

Generowanie raportów

Będziemy teraz kompilować i uruchamiać te pliki przy użyciu naszego zwykłego procesu kompilacji ANT. Plik build.xml jest taki, jak podano poniżej -

Plik importu - baseBuild.xml jest pobierany z rozdziału Konfiguracja środowiska i powinien być umieszczony w tym samym katalogu co build.xml.

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "executereport" basedir = ".">
   <import file = "baseBuild.xml"/>

   <target name = "executereport" depends = "compile,compilereportdesing,run">
      <echo message = "Im here"/>
   </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 polecenie ant -Dmain-class = com.tutorialspoint.JasperReportFill (executereport jest domyślnym celem) w następujący sposób -

C:\tools\jasperreports-5.0.1\test>ant -Dmain-class = com.tutorialspoint.JasperReportFill
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml

compile:
   [javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:27:
   warning: 'includeantruntime' was not set, defaulting to
   build.sysclasspath=last; set to false for repeatable builds
   [javac] Compiling 1 source file to
   C:\tools\jasperreports-5.0.1\test\classes

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.

BUILD SUCCESSFUL
Total time: 8 seconds

W wyniku powyższego wykonania, w tym samym katalogu co plik .jasper generowany jest plik jasper_report_template.jrprint (w tym przypadku jest on generowany w C: \ tools \ jasperreports-5.0.1 \ test).

Wynik procesu wypełniania raportu Obiekty JasperPrint można przeglądać za pomocą wbudowanego komponentu przeglądarki, drukować lub eksportować do bardziej popularnych formatów dokumentów, takich jak PDF, HTML, RTF, XLS, ODT, CSV lub XML. Przeglądanie i drukowanie dokumentów Jasper zostanie omówione w tym rozdziale, a eksport zostanie omówiony w następnym rozdziale, tj. „Raporty eksportowe”.

Przeglądanie raportów

JasperReport zapewnia wbudowaną przeglądarkę do przeglądania wygenerowanych raportów w oryginalnym formacie. Jest to komponent oparty na swing, a inne aplikacje Java mogą integrować ten komponent bez konieczności eksportowania dokumentów do innych formatów w celu ich przeglądania lub drukowania. Net.sf.jasperreports.view.JRViewer klasa reprezentuje ten komponent wizualny. Tę klasę można również dostosować zgodnie z potrzebami aplikacji, klasyfikując ją.

JasperReports ma również aplikację Swing, która wykorzystuje komponent wizualny do przeglądania raportów. Ta aplikacja pomaga przeglądać raporty w tym samym formacie, w jakim jest tworzony * .jrprint. Ta aplikacja Swing jest zaimplementowana w klasie net.sf.jasperreports.view.JasperViewer . Aby wyświetlić raporty korzystające z tej klasy, musimy umieścić ją w celu ANT.

Przeglądanie wygenerowanego raportu

Poniższy przykład demonstruje - jak wyświetlić raport za pomocą klasy JasperViewer -

Napiszmy szablon raportu. Zawartość pliku JRXML (C: \ tools \ jasperreports-5.0.1 \ test \ jasper_report_template.jrxml) jest taka, jak podano poniżej -

<?xml version = "1.0" encoding = "UTF-8"?>
<!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" language = "groovy" pageWidth = "595"
   pageHeight = "842" columnWidth = "555" leftMargin = "20" rightMargin = "20"
   topMargin = "20" bottomMargin = "20">

   <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>
   
   <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 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" />
            <textElement textAlignment = "Center" verticalAlignment = "Middle" />
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{name}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </detail>
	
</jasperReport>

Następnie przekażmy kolekcję obiektów danych Java (ziaren Java) do JasperReports Engine, aby wypełnić ten skompilowany raport.

Napisz POJO DataBean.java, który reprezentuje obiekt danych (komponent bean Java). Ta klasa definiuje dwa obiekty typu String, tj. „Name” i „country”. Zapisz go w kataloguC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint.

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;
   }
}

Napisz klasę DataBeanList.java, która ma logikę biznesową do generowania kolekcji obiektów java bean. Jest to dalej przekazywane do silnika JasperReports w celu wygenerowania raportu. Tutaj dodajemy 4 obiekty DataBean do listy. Zapisz go w kataloguC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint.

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;
   }
}

Napisz główny plik klasy JasperReportFill.java, który pobiera kolekcję java bean z klasy (DataBeanList) i przekazuje ją do silnika JasperReports w celu wypełnienia szablonu raportu. Zapisz go w kataloguC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint.

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();
      try {
         JasperFillManager.fillReportToFile( 
            sourceFileName, parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

Napiszmy cel viewFillReportdo pliku build.xml. Plik build.xml jest następujący -

Plik importu - baseBuild.xml jest pobierany z rozdziału Konfiguracja środowiska i powinien być umieszczony w tym samym katalogu co 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 polecenie ant -Dmain-class=com.tutorialspoint.JasperReportFill(domyślnym celem jest viewFillReport). W rezultacie widzimy okno JasperViewer, jak pokazano na poniższym ekranie -

Drukowanie raportów

Możemy drukować dokumenty generowane przez bibliotekę JasperReports (w ich własnym formacie tj JasperPrint obiektów) za pomocą net.sf.jasperreports.engine.JasperPrintManager klasę. To jest klasa fasady, która opiera się na Java 2 Printing API. Możemy również wydrukować dokumenty po wyeksportowaniu dokumentów JasperReport do innych formatów, takich jak HTML lub PDF.

Drukowanie wygenerowanego raportu

Poniższy kod ilustruje drukowanie raportu. Zaktualizujmy naszą istniejącą klasę JasperReportFill. Użyjemy metody JasperPrintManager.printReport () . Ta metoda przyjmuje nazwę pliku źródłowego (tutaj przekazujemy plik .jrprint , który generujemy w poprzednim kroku za pomocą metody JasperFillManager.fillReportToFile ()) jako pierwszy parametr. Drugi parametr jest wartością logiczną do wyświetlania standardowego okna dialogowego drukowania (ustawiliśmy go natrue tutaj).

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.JasperPrintManager;
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";
      String printFileName = null;
      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();

      JRBeanCollectionDataSource beanColDataSource = new 
         JRBeanCollectionDataSource(dataList);

      Map parameters = new HashMap();
      try {
    	   printFileName = JasperFillManager.fillReportToFile( 
            sourceFileName, parameters, beanColDataSource);
         if(printFileName != null){
            JasperPrintManager.printReport( printFileName, true);
         }
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

Teraz zapiszmy ten plik w katalogu C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint. Skompilujemy i uruchomimy ten plik za pomocą ANT. Zawartość pliku build.xml jest taka, jak podano poniżej -

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "executereport" basedir = ".">
   <import file = "baseBuild.xml"/>

   <target name = "executereport" depends = "compile,compilereportdesing,run">
      <echo message = "Im here"/>
   </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 wiersz poleceń i przejdźmy do katalogu, w którym znajduje się plik build.xml. Na koniec wykonaj polecenieant -Dmain-class=com.tutorialspoint.JasperReportPrint. W rezultacie pojawi się okno dialogowe drukowania. Kliknij OK, aby wydrukować dokument.

W poprzednim rozdziale widzieliśmy, jak wydrukować i wyświetlić dokument wygenerowany przez JasperReport. Tutaj zobaczymy, jak przekształcić lub wyeksportować te raporty do innych formatów, takich jak PDF, HTML i XLS. Aby osiągnąć tę funkcjonalność, przewidziano klasę fasadową net.sf.jasperreports.engine.JasperExportManager . Eksportu środki przekształcania JasperPrint obiekt (.jrprint plików) do innego formatu.

Poniższy kod (JasperReportExport.java) ilustruje proces eksportowania dokumentu JasperReport. JasperExportManager zapewnia metody eksportowania raportu tylko do formatu PDF, HTML i XML. Aby wyeksportować do formatu XLS, użyliśmy klasy net.sf.jasperreports.engine.export.JRXlsExporter . Ten kod generuje następujące trzy pliki -

  • sample_report.pdf
  • sample_report.html
  • sample_report.xls

Eksportowanie do innych formatów

Napiszmy szablon raportu. Zawartość pliku JRXML (C: \ tools \ jasperreports-5.0.1 \ test \ jasper_report_template.jrxml) jest jak poniżej -

<?xml version = "1.0" encoding = "UTF-8"?>
<!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" language = "groovy" pageWidth = "595"
   pageHeight = "842" columnWidth = "555" leftMargin = "20" rightMargin = "20"
   topMargin = "20" bottomMargin = "20">

   <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>
   
   <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 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" /> <textElement textAlignment = "Center" verticalAlignment = "Middle" /> <textFieldExpression class = "java.lang.String"> <![CDATA[$F{name}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </detail>
	
</jasperReport>

Następnie zawartość pliku POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java są jak podano 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 podano 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;
   }
}

Napisz główny plik klasy JasperReportFill.java, który pobiera kolekcję java bean z klasy (DataBeanList) i przekazuje ją do silnika JasperReports w celu wypełnienia szablonu raportu. Zapisz go w kataloguC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint.

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.JRExporterParameter;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.JRXlsExporter;

public class JasperReportFill {
   @SuppressWarnings("unchecked")
   public static void main(String[] args) {
      String sourceFileName = "c://tools/jasperreports-5.0.1/"
         + "test/jasper_report_template.jasper";
      String printFileName = null;
      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();
      JRBeanCollectionDataSource beanColDataSource =
         new JRBeanCollectionDataSource(dataList);

      Map parameters = new HashMap();
      try {
         printFileName = JasperFillManager.fillReportToFile(sourceFileName,
            parameters, beanColDataSource);
         if (printFileName != null) {
            /**
             * 1- export to PDF
             */
            JasperExportManager.exportReportToPdfFile(printFileName,
               "C://sample_report.pdf");

            /**
             * 2- export to HTML
             */
            JasperExportManager.exportReportToHtmlFile(printFileName,
               "C://sample_report.html");

            /**
             * 3- export to Excel sheet
             */
            JRXlsExporter exporter = new JRXlsExporter();

            exporter.setParameter(JRExporterParameter.INPUT_FILE_NAME,
               printFileName);
            exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME,
               "C://sample_report.xls");

            exporter.exportReport();
         }
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

Tutaj zawarliśmy logikę eksportowania pliku wydruku jaspisu do formatu pdf, html i xls.

Generowanie raportów

Skompilujmy i uruchommy powyższe pliki przy użyciu naszego zwykłego procesu kompilacji ANT. Plik build.xml jest taki, jak podano poniżej -

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "executereport" basedir = ".">
   <import file = "baseBuild.xml"/>

   <target name = "executereport" depends = "compile,compilereportdesing,run">
      <echo message = "Im here"/>
   </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>

Przejdź do wiersza poleceń, a następnie przejdź do katalogu C: \ tools \ jasperreports-5.0.1 \ test, w którym znajduje się plik build.xml. Na koniec wykonaj polecenieant -Dmain-class=com.tutorialspoint.JasperReportFill. Dane wyjściowe są następujące -

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 t
   [javac] Compiling 4 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.

executereport:
   [echo] Im here

BUILD SUCCESSFUL
Total time: 32 seconds

W wyniku powyższego wykonania w katalogu C: \ zostaną wygenerowane trzy pliki sample_report.pdf, sample_report.html, sample_report.xls.

Główne dane wejściowe do wypełnienia raportu to - szablon raportu, parametry i źródła danych. W tym rozdziale zostaną opisane parametry, aw następnym omówimy źródła danych.

Parametry to odwołania do obiektów, które są przekazywane podczas operacji wypełniania raportów do silnika raportów. Dane, których nie można przekazać przez źródło danych, można przekazać za pomocą parametrów. Dane takie jak nazwisko autora, tytuł raportu itp. Mogą być przekazywane przez parametry. Szablon JasperReports lub szablon JRXML może mieć zero lub więcej elementów parametrów.

Deklaracja parametrów

Deklaracja parametrów w następujący sposób -

<parameter name = "exampleParameter" class = "java.lang.String" />

Atrybut nazwy

Nazwa atrybutem <parameter> element jest obowiązkowe. Odwołuje się do parametru w wyrażeniach raportu według nazwy. Nazwa parametru powinna być pojedynczym słowem. Nie powinien zawierać żadnych znaków specjalnych, takich jak kropka czy przecinek.

Atrybut klasy

Klasa atrybut jest również obowiązkowe i określa nazwę klasy dla wartości parametrów. Jego domyślną wartością jest java.lang.String . Można to zmienić na dowolną klasę dostępną w czasie wykonywania. Niezależnie od typu parametru raportu silnik dba o rzutowanie w wyrażeniach raportu, w których używany jest token $ P {}, dlatego ręczne rzutowanie jest zbędne.

Wartości parametrów raportu są zawsze umieszczane w obiekcie java.util.Map, którego kluczem jest nazwa parametru. Parametry raportu mogą być używane w ciągu zapytania raportu, aby dodatkowo dostosować zestaw danych pobieranych z bazy danych. Działają one jak dynamiczne filtry w zapytaniu dostarczającym dane do raportu.

Wbudowane parametry

Poniżej znajdują się wstępnie zdefiniowane parametry raportu, gotowe do użycia w wyrażeniach -

S.NO Nazwa i opis parametru
1

REPORT_PARAMETERS_MAP

Zawiera mapę ze wszystkimi parametrami zdefiniowanymi i wbudowanymi przez użytkownika.

2

REPORT_CONNECTION

Wskazuje to na dostarczoną przez użytkownika klasę java.sql.Connection, używaną dla źródeł danych JDBC.

3

REPORT_DATA_SOURCE

To jest dostarczana przez użytkownika instancja JRDataSource reprezentująca jeden z wbudowanych typów źródeł danych lub zdefiniowane przez użytkownika.

4

REPORT_MAX_COUNT

To jest wartość java.lang.Integer , umożliwiająca użytkownikom ograniczenie rekordów ze źródła danych.

5

REPORT_SCRIPTLET

Wskazuje on na net.sf.jasperreports.engine.JRAbstractScriptlet i zawiera instancję skryptletu raportu dostarczonego przez użytkownika.

6

REPORT_LOCALE

To instancja java.util.Locale , zawierająca pakiet zasobów o żądanym ustawieniu narodowym.

7

REPORT_RESOURCE_BUNDLE

Wskazuje na obiekt java.util.ResourceBundle i zawiera zlokalizowane komunikaty.

8

REPORT_TIME_ZONE

To jest instancja java.util.TimeZone używana do formatowania daty.

9

REPORT_VIRTUALIZER

Jest to instancja obiektu net.sf.jasperreports.engine.JRVirtualizer , używana do wirtualizacji strony (optymalizacja zużycia pamięci).

10

REPORT_CLASS_LOADER

To jest instancja java.lang.ClassLoader używana podczas wypełniania raportu do ładowania zasobów, takich jak obrazy, czcionki i szablony podraportów

11

IS_IGNORE_PAGINATION

Jeśli ustawione na java.lang.Boolean.TRUE, raport zostanie wygenerowany na jednej długiej stronie i nie nastąpi podział strony.

Przykład

Przejdźmy ReportTitle i Autor raportu (wygenerowanej przez JasperReportFill.java). Poprawiony plikC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java wygląda następująco -

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 podano 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;
   }
}

Dodajmy parametry <ReportTitle> i <Author> do naszego istniejącego szablonu raportu (Rozdział Projekty raportów ). Tytuł raportu i autor zostaną wyświetlone na początku raportu. 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">
	
   <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>

   <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 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" />
            <textElement textAlignment = "Center" verticalAlignment = "Middle" />
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{name}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </detail>
	
</jasperReport>

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 następująca.

Plik importu - baseBuild.xml jest pobierany z rozdziału Konfiguracja środowiska i powinien być umieszczony w tym samym katalogu co 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 (viewFullReport jest domyślnym celem) w następujący sposób -

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 7 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.

BUILD SUCCESSFUL
Total time: 18 seconds

W wyniku powyższej kompilacji otworzy się okno JasperViewer, jak pokazano na poniższym ekranie -

Tutaj widzimy, że ReportTitle „Lista kontaktów” i Autor „Przygotowane przez Manishę” są wyświetlane na początku raportu.

Źródła danych to kontener danych strukturalnych. Podczas generowania raportu silnik JasperReports pobiera dane ze źródeł danych. Dane można uzyskać z baz danych, plików XML, tablic obiektów i kolekcji obiektów. Jak widzieliśmy w rozdziale Raporty wypełniania , metoda fillReportXXX () spodziewa się otrzymać źródło danych raportu, które musi wypełnić, w postacinet.sf.jasperreports.engine.JRDataSource obiekt lub a java.sql.Connection (gdy dane raportu znajdują się w relacyjnej bazie danych).

Interfejs JRDataSource ma tylko dwie metody, które należy zaimplementować -

  • public boolean next () rzuca JRException;

    • W czasie wypełniania raportu ta metoda jest wywoływana na obiekcie źródła danych przez silnik raportujący podczas iteracji po danych.

  • public Object getFieldValue (JRField jrField) zgłasza JRException;

    • Ta metoda zapewnia wartość dla każdego pola raportu w bieżącym rekordzie źródła danych.

Jedynym sposobem na pobranie danych ze źródła danych jest użycie pól raportu. Istnieje kilka domyślnych implementacji interfejsu JRDataSource, w zależności od sposobu pozyskiwania rekordów w źródle danych.

Implementacje źródła danych

Poniższa tabela podsumowuje źródła danych i klasy ich implementacji -

Źródło danych Klasa implementacji
JDBC net.sf.jasperreports.engine.JRResultSetDataSource
JavaBean net.sf.jasperreports.engine.data.JRBeanCollectionDataSource, net.sf.jasperreports.engine.data.JRBeanArrayDataSource
Oparte na mapie net.sf.jasperreports.engine.data.JRMapArrayDataSource, net.sf.jasperreports.engine.data.JRMapCollectionDataSource
TableModel net.sf.jasperreports.engine.data.JRTableModelDataSource
XML net.sf.jasperreports.engine.data.JRXmlDataSource
CSV net.sf.jasperreports.engine.data.JRCsvDataSource
XLS net.sf.jasperreports.engine.data.JRXlsDataSource
Pusty net.sf.jasperreports.engine.JREmptyDataSource

Źródła danych JDBC

Klasa JRResultSetDataSourcecraps się java.sql.ResultSet obiekt. Jest to najczęściej używana implementacja źródła danych, gdy dane raportu są wyodrębniane z relacyjnej bazy danych. Jeśli zamiast tego do mechanizmu przekazywany jest element java.sql.Connection , najpierw wykonuje on pokrewne zapytanie i zapisuje zwrócony obiekt java.sql.ResultSet w instancji JRResultSetDataSource.

Źródła danych JavaBean

Zajęcia JRBeanArrayDataSource i JRBeanCollectionDataSourcereprezentują implementacje, które mogą zawijać tablice i kolekcje obiektów JavaBean. Każdy obiekt w tablicy lub kolekcji będzie postrzegany jako jeden rekord w tego typu źródle danych. Odwzorowanie między określoną właściwością JavaBean a odpowiednim polem raportu jest wykonywane przy użyciu konwencji nazewnictwa. Nazwa pola raportu musi być taka sama, jak nazwa właściwości JavaBean, jak określono w specyfikacjach JavaBeans.

We wszystkich przykładach tego samouczka używaliśmy JRBeanCollectionDataSource.

Źródła danych oparte na mapach

Klasy implementacji JRMapArrayDataSource i JRMapCollectionDataSourcesą przydatne, jeśli aplikacja nadrzędna już przechowuje dane raportowania dostępne w pamięci jako obiekty java.util.Map . Każdy obiekt Map w opakowanej tablicy lub kolekcji jest traktowany jako wirtualny rekord w źródle danych, a wartość każdego pola raportu jest wyodrębniana z mapy przy użyciu pola raportu nazwanego jako klucz.

Źródła danych TableModel

W wielu aplikacjach po stronie klienta dane są wyświetlane w formacie tabelarycznym. Typowym wymaganiem w wielu aplikacjach jest umożliwienie użytkownikowi wydrukowania tego formatu tabelarycznego jako raportu. Klasa realizacjiJRTableModelDataSourcesprawia, że ​​zadanie generowania raportów z formatu tabelarycznego jest dla aplikacji Swing banalne. Ta klasa opakowuje obiekt javax.swing.table.TableModel. Dostęp do kolumn w opakowanym obiekcie TableModel można uzyskać za pomocą ich nazw lub indeksów opartych na 0.

Źródła danych XML

Klasa JRXmlDataSourcejest implementacją źródła danych opartą na DOM, która używa wyrażeń XPath do wybierania danych z dokumentu XML. Rekordy w źródle danych XML są reprezentowane przez elementy węzłów wybrane za pomocą wyrażenia XPath. Wartości pól są pobierane z każdego rekordu przy użyciu wyrażenia XPath podanego w opisie pola (element <fieldDescription> w JRXML).

XPath to język używany do nawigacji po atrybutach i elementach dokumentu XML. Więcej informacji o XPath można znaleźć pod adresemhttp://www.w3.org/TR/xpath.

Źródła danych CSV

JRCsvDataSourcereprezentuje implementację dla źródeł danych, które pobierają dane ze strukturalnych plików tekstowych; zwykle pliki CSV. Wartości pól są pobierane przy użyciu indeksu ich kolumn.

Źródła danych XLS

JRXlsDataSourcereprezentuje implementację dla źródeł danych, które pobierają dane z dokumentów programu Excel. Mapowanie pól raportu dla tej implementacji źródła danych jest również oparte na indeksie kolumny pola.

Puste źródła danych

Klasa JREmptyDataSource, symuluje źródło danych z określoną liczbą wirtualnych pustych rekordów. Jest używany przez narzędzia interfejsu użytkownika do oferowania podstawowych funkcji podglądu raportów lub w specjalnych szablonach raportów lub do celów testowania i debugowania.

Przewijalne źródła danych

Plik net.sf.jasperreports.engine.JRRewindableDataSourcerozszerza podstawowy interfejs JRDataSource . Dodaje tylko jedną metodę o nazwie moveFirst () do interfejsu. Ta metoda ma na celu przeniesienie kursora do pierwszego elementu w źródle danych.

Przewijalne źródła danych są przydatne podczas pracy z raportami podrzędnymi umieszczonymi wewnątrz pasma, którego nie można podzielić z powodu ustawienia isSplitAllowed = "false", a na bieżącej stronie nie ma wystarczającej ilości miejsca na renderowanie raportu podrzędnego.

Wszystkie powyższe implementacje źródeł danych można przewijać, z wyjątkiem JRResultSetDataSource, ponieważ nie obsługuje cofania wskaźnika rekordu. Stwarza to problem tylko wtedy, gdy to źródło danych jest używane ręcznie do zawijania zestawu java.sql.ResultSet przed przekazaniem go do raportu podrzędnego. Nie ma problemu, jeśli zapytanie SQL znajduje się w szablonie raportu podrzędnego, ponieważ silnik wykona je ponownie po ponownym uruchomieniu raportu podrzędnego na następnej stronie.

Dostawcy źródeł danych

Biblioteka JasperReports ma interfejs net.sf.jasperreports.engine.JRDataSourceProvider. Pomaga to w tworzeniu i usuwaniu obiektów źródła danych. Podczas tworzenia szablonu raportu za pomocą narzędzi GUI potrzebne jest specjalne narzędzie do dostosowywania źródła danych raportu. JRDataSourceProvider to standardowy sposób podłączenia niestandardowych źródeł danych do narzędzia projektowego. Niestandardowa implementacja tego interfejsu powinna implementować następujące metody, które umożliwiają tworzenie i usuwanie obiektów źródła danych, a także metody wyświetlania dostępnych pól raportów w źródle danych, jeśli to możliwe -

public boolean supportsGetFieldsOperation();

public JRField[] getFields(JasperReport report)
   throws JRException, UnsupportedOperationException;

public JRDataSource create(JasperReport report) throws JRException;

public void dispose(JRDataSource dataSource) throws JRException;

Pola raportu to elementy, które reprezentują mapowanie danych między źródłem danych a szablonem raportu. Pola można łączyć w wyrażeniach raportu, aby uzyskać żądane wyniki. Szablon raportu może zawierać zero lub więcej elementów <field>. Podczas deklarowania pól raportu źródło danych powinno dostarczać dane odpowiadające wszystkim polom zdefiniowanym w szablonie raportu.

Deklaracja terenowa

Deklaracja terenowa jest wykonywana jak pokazano poniżej -

<field name = "FieldName" class = "java.lang.String"/>

Atrybut nazwy

Nazwa atrybutem <Field> elementu jest obowiązkowe. Odwołuje się do pola w wyrażeniach raportu według nazwy.

Atrybut klasy

Klasa atrybut określa nazwę klasy dla wartości pola. Jego domyślną wartością jest java.lang.String . Można to zmienić na dowolną klasę dostępną w czasie wykonywania. Niezależnie od typu pola raportu silnik dba o rzutowanie w wyrażeniach raportu, w których używany jest token $ F {}, dzięki czemu ręczne rzutowanie jest zbędne.

Opis pola

Element <fieldDesciption> jest elementem opcjonalnym. Jest to bardzo przydatne podczas implementowania niestandardowego źródła danych. Na przykład możemy przechowywać klucz lub pewne informacje, dzięki którym możemy pobrać wartość pola z niestandardowego źródła danych w czasie wykonywania. Używając elementu <fieldDesciption> zamiast nazwy pola, można łatwo obejść ograniczenia konwencji nazewnictwa pól podczas pobierania wartości pól ze źródła danych.

Poniżej znajduje się fragment kodu z naszego istniejącego pliku JRXML (Rozdział Projekty raportów ). Tutaj możemy zobaczyć użyciename, class, i fieldDescription elementy.

<field name = "country" class = "java.lang.String">
   <fieldDescription><![CDATA[country]]></fieldDescription>
</field>

<field name = "name" class = "java.lang.String">
   <fieldDescription><![CDATA[name]]></fieldDescription>
</field>

Sortuj pola

W czasach, gdy wymagane jest sortowanie danych, a implementacja źródła danych go nie obsługuje (np. Źródło danych CSV), JasperReports obsługuje sortowanie źródeł danych w oparciu o pola w pamięci. Sortowanie można przeprowadzić za pomocą jednego lub więcej elementów <sortField> w szablonie raportu.

Jeśli określono co najmniej jedno pole sortowania, podczas wypełniania raportu źródło danych jest przekazywane do instancji JRSortableDataSource . To z kolei pobiera wszystkie rekordy ze źródła danych, przeprowadza sortowanie w pamięci zgodnie z określonymi polami i zastępuje oryginalne źródło danych.

Nazwa pola sortowania powinna być taka sama, jak nazwa pola raportu. Pola używane do sortowania powinny mieć typy implementujące java.util.Comparable. Sortowanie według porządku naturalnego jest wykonywane dla wszystkich pól z wyjątkiem pól typu java.lang.String (w przypadku typu String używany jest collator odpowiadający ustawieniom narodowym wypełniania raportu). Jeśli określono kilka pól sortowania, sortowanie zostanie przeprowadzone przy użyciu pól jako kluczy sortowania w kolejności, w jakiej pojawiają się w szablonie raportu. Poniższy przykład przedstawia funkcję sortowania.

Przykład sortowanego raportu

Dodajmy <sortField> do naszego istniejącego szablonu raportu (Rozdział Projekty raportów ). Posortujmy kraj pola w porządku malejącym. 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">
	
   <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>
  
   <sortField name = "country" order = "Descending"/>
   <sortField name = "name"/>
   
   <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 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" />
            <textElement textAlignment = "Center" verticalAlignment = "Middle" />
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{name}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </detail>

</jasperReport>

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 podano 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 podano 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 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 (viewFullReport jest domyślnym celem) w następujący sposób -

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 7 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.

BUILD SUCCESSFUL
Total time: 18 seconds

W wyniku powyższej kompilacji otworzy się okno JasperViewer, jak pokazano na poniższym ekranie -

Tutaj widzimy, że nazwy krajów są ułożone malejąco w kolejności alfabetycznej.

Wyrażenia raportu to potężne funkcje JasperReports, które pozwalają nam wyświetlać obliczone dane w raporcie. Dane obliczeniowe to dane, które nie są danymi statycznymi i nie są przekazywane jako parametr raportu lub pole źródła danych. Wyrażenia raportu są tworzone z połączenia parametrów raportu, pól i danych statycznych. Domyślnie język Java jest używany do pisania wyrażeń raportów. Kompilatory JasperReports obsługują inne języki skryptowe dla wyrażeń raportów, takie jak język skryptowy Groovy, JavaScript lub skrypt BeanShell.

W tym rozdziale wyjaśniono - jak działają wyrażenia raportów, zakładając, że zostały napisane wyłącznie w języku Java. W szablonie raportu JRXML istnieje kilka elementów, które definiują wyrażenia jako -

  • <variableExpression>
  • <initialValueExpression>
  • <groupExpression>
  • <printWhenExpression>
  • <imageExpression>
  • <textFieldExpression>

Deklaracja wyrażenia

Zasadniczo wszystkie wyrażenia raportu są wyrażeniami Java, które mogą odwoływać się do pól raportu, zmiennych raportu i parametrów raportu.

Odniesienie do pola w wyrażeniu

Aby użyć odwołania do pola raportu w wyrażeniu, nazwę pola należy umieścić między $F{i} sekwencje znaków, jak pokazano poniżej -

<textfieldexpression>
   $F{Name}
</textfieldexpression>

Poniżej znajduje się fragment kodu z naszego istniejącego pliku JRXML (rozdział Projekty raportów) -

<textFieldExpression class = "java.lang.String">
   <![CDATA[$F{country}]]>
</textFieldExpression>

Odniesienie do zmiennej w wyrażeniu

Aby odwołać się do zmiennej w wyrażeniu, musimy umieścić nazwę zmiennej pomiędzy $V{i} jak pokazano na poniższym przykładzie -

<textfieldexpression>
   "Total height : " + $V{SumOfHeight} + " ft."
</textfieldexpression>

Odniesienie do parametru w wyrażeniu

Aby odwołać się do parametru w wyrażeniu, nazwę parametru należy umieścić pomiędzy $P{i} jak pokazano na poniższym przykładzie -

<textfieldexpression>
   "ReportTitle : " + $P{Title}
</textfieldexpression>

Poniżej znajduje się fragment kodu z naszego istniejącego pliku JRXML, który demonstruje odniesienie do parametru w wyrażeniu. (JRXML z rozdziału Projekty raportów ) -

<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>

Jak widzieliśmy powyżej, odwołania do parametrów, pól i zmiennych są w rzeczywistości rzeczywistymi obiektami Java. Znając ich klasę z parametru, pola lub deklaracji zmiennej w szablonie raportu, możemy nawet wywołać metody na tych odwołaniach do obiektów w wyrażeniach.

Poniższy przykład pokazuje - jak wyodrębnić i wyświetlić pierwszą literę z pola raportu java.lang.String "Nazwa" -

<textFieldExpression>
   $F{Name}.substring(0, 1)
</textFieldExpression>

Odniesienie do pakietu zasobów w wyrażeniu

Aby odwołać się do zasobu w wyrażeniu, klucz należy umieścić między$R{i} jak pokazano na poniższym przykładzie -

<textfieldexpression>
   $R{report.title}
</textfieldexpression>

Na podstawie ustawień regionalnych dostarczonych przez środowisko wykonawcze i klucza report.title ładowany jest pakiet zasobów powiązany z szablonem raportu. W związku z tym tytuł raportu jest wyświetlany przez wyodrębnienie wartości String z pakunku zasobów. Więcej o internacjonalizacji można znaleźć w rozdziale Umiędzynarodowienie .

Kalkulator

Kalkulator to jednostka w JasperReports, która ocenia wyrażenia i zwiększa zmienne lub zestawy danych w czasie wypełniania raportu. Podczas procesu kompilacji informacje są tworzone i przechowywane w raporcie kompilacji przez kompilator. Informacje te są wykorzystywane w czasie wypełniania raportu do tworzenia instancji klasy net.sf.jasperreports.engine.fill.JRCalculator.

Plik źródłowy Java jest generowany i kompilowany w locie przez oparte na Javie kompilatory raportów. Ta wygenerowana klasa jest podklasą JRCalculator, a kod bajtowy utworzony przez jej kompilację jest przechowywany w obiekcie JasperReport. Ten kod bajtowy jest ładowany w czasie wypełniania raportu, a wynikowa klasa jest tworzona w celu uzyskania obiektu kalkulatora potrzebnego do oceny wyrażenia.

Wyrażenia warunkowe

JasperReports nie obsługuje instrukcji if-else podczas definiowania wyrażeń zmiennych. Zamiast tego możesz użyć operatorów trójskładnikowych{cond} ? {statement 1} : {statement 2}. Ten operator można zagnieżdżać w wyrażeniu Java, aby uzyskać żądane dane wyjściowe na podstawie wielu warunków.

Przykład wyrażenia warunkowego w raporcie

Zmodyfikujmy istniejący szablon raportu (Rozdział Projekty raportów ) i dodajmy wyrażenie warunkowe dla kraju pola. 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">

   <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>
   
   <sortField name = "country" order = "Descending"/>
   <sortField name = "name"/>
   
   <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 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}.isEmpty() ? "NO COUNTRY" : $F{country}]]>
            </textFieldExpression>
         </textField>
         
         <textField>
            <reportElement x = "0" y = "0" width = "136" height = "15" />
            <textElement textAlignment = "Center" verticalAlignment = "Middle" />
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{name}]]>
            </textFieldExpression>
         </textField>
			
      </band>
   </detail>
	
</jasperReport>

Kody Java do wypełniania raportów są następujące. Zawartość plikuC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java są jak -

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 -

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;
   }
}

Dodamy nowy rekord z pustym polem kraju na naszej liście Java bean. Zawartość plikuC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java są jak -

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")); dataBeanList.add(produce("Tanmay", ""));
      
      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. Poniżej podano zawartość pliku build.xml (zapisanego w katalogu C: \ tools \ jasperreports-5.0.1 \ test).

Plik importu - baseBuild.xml jest pobierany z rozdziału Konfiguracja środowiska i powinien być umieszczony w tym samym katalogu, co 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.

BUILD SUCCESSFUL
Total time: 5 minutes 5 seconds

C:\tools\jasperreports-5.0.1\test>

W wyniku powyższej kompilacji otworzy się okno JasperViewer, jak pokazano na poniższym ekranie -

Tutaj widzimy, że dla ostatniego rekordu nie przekazaliśmy żadnych danych dla kraju pola, drukowany jest napis „NO COUNTRY”.

Zmienne raportowe to specjalne obiekty zbudowane na podstawie wyrażenia raportu.

Zmienne raportu upraszczają następujące zadania -

  • Wyrażenia raportu, które są często używane w szablonie raportu. Te wyrażenia można zadeklarować tylko raz, używając zmiennych raportu.

  • Zmienne raportu mogą wykonywać różne obliczenia na podstawie odpowiednich wartości wyrażeń, takich jak liczba, suma, średnia, najniższa, najwyższa, wariancja itp.

Jeśli zmienne są zdefiniowane w projekcie raportu, można do nich odwoływać się za pomocą nowych zmiennych w wyrażeniach. Dlatego kolejność, w jakiej zmienne są deklarowane w projekcie raportu, jest ważna.

Deklaracja zmiennej

Deklaracja zmiennej wygląda następująco -

<variable name = "CityNumber" class = "java.lang.Integer" incrementType = "Group"
   incrementGroup = "CityGroup" calculation = "Count">
   <variableExpression>
      <![CDATA[Boolean.TRUE]]>
   </variableExpression>
</variable>

Jak widać powyżej, element <variable> zawiera wiele atrybutów. Te atrybuty są podsumowane poniżej -

Atrybut nazwy

Podobnie jak w przypadku parametrów i pól , atrybut name elementu </variable> jest obowiązkowy. Umożliwia odwoływanie się do zmiennej przez jej zadeklarowaną nazwę w wyrażeniach raportu.

Atrybut klasy

Klasa atrybut jest również obowiązkowe, które określa nazwę klasy dla wartości zmiennych. Jego domyślną wartością jest java.lang.String . Można to zmienić na dowolną klasę dostępną w ścieżce klas, zarówno w czasie kompilacji raportu, jak i podczas wypełniania raportu. Silnik dba o rzutowanie typów w wyrażeniach raportu, w których używany jest token $ V {}, dlatego ręczne rzutowanie typów nie jest wymagane.

Obliczenie

Ten atrybut określa - jakie obliczenia wykonać na zmiennej podczas wypełniania raportu. W poniższych podrozdziałach opisano wszystkie możliwe wartości atrybutu obliczeniowego elementu <variable>.

  • Średnia - wartość zmiennej jest średnią wszystkich niezerowych wartości wyrażenia zmiennej. Obowiązuje tylko dla zmiennych numerycznych.

  • Licznik - wartość zmiennej to liczba niezerowych wystąpień wyrażenia zmiennej.

  • First - Wartość zmiennej to wartość pierwszego wystąpienia wyrażenia zmiennej. Kolejne wartości są ignorowane.

  • Najwyższa - wartość zmiennej to najwyższa wartość wyrażenia zmiennej.

  • Najniższa - wartość zmiennej to najniższa wartość wyrażenia zmiennej w raporcie.

  • Nic - na zmiennej nie są wykonywane żadne obliczenia.

  • Odchylenie standardowe - wartość zmiennej jest odchyleniem standardowym wszystkich wartości innych niż null pasujących do wyrażenia raportu. Obowiązuje tylko dla zmiennych numerycznych.

  • Suma - wartość zmiennej to suma wszystkich wartości innych niż null zwróconych przez wyrażenie raportu.

  • System - wartość zmiennej jest obliczeniem niestandardowym (samodzielne obliczenie wartości tej zmiennej przy użyciu funkcji skryptletów JasperReports).

  • Wariancja - wartość zmiennej to wariancja wszystkich wartości innych niż null zwracanych przez ocenę wyrażenia zmiennej raportu.

Incrementer FactoryClass

Ten atrybut określa klasę używaną do obliczania wartości zmiennej podczas wypełniania bieżącego rekordu w raporcie. Wartością domyślną byłaby implementacja dowolnej klasynet.sf.jasperreports.engine.fill.JRIncrementerFactory. Klasa fabryczna będzie używana przez silnik do tworzenia instancji obiektów przyrostowych w czasie wykonywania w zależności od atrybutu obliczeń ustawionego dla zmiennej.

IncrementType

To określa, kiedy ponownie obliczyć wartość zmiennej. Ten atrybut używa wartości, jak poniżej -

  • Kolumna - wartość zmiennej jest ponownie obliczana na końcu każdej kolumny.

  • Grupa - wartość zmiennej jest ponownie obliczana, gdy zmienia się grupa określona przez parametr IncrementGroup.

  • Brak - wartość zmiennej jest ponownie obliczana z każdym rekordem.

  • Strona - wartość zmiennej jest przeliczana na końcu każdej strony.

  • Raport - wartość zmiennej jest przeliczana raz, na koniec raportu.

IncrementGroup

To określa nazwę grupy, w której wartość zmiennej jest ponownie obliczana, gdy typ inkrementacji to Group . To przyjmuje nazwę dowolnej grupy zadeklarowanej w szablonie raportu JRXML.

ResetType

Określa to, kiedy wartość zmiennej jest resetowana. Ten atrybut używa wartości, jak poniżej -

  • Kolumna - wartość zmiennej jest resetowana na początku każdej kolumny.

  • Grupa - wartość zmiennej jest resetowana, gdy zmienia się grupa określona przez parametr IncrementGroup.

  • Brak - wartość zmiennej nigdy nie jest resetowana.

  • Strona - wartość zmiennej jest resetowana na początku każdej strony.

  • Raport - wartość zmiennej jest resetowana tylko raz, na początku raportu.

ResetGroup

Określa nazwę grupy, w której wartość zmiennej jest resetowana, gdy resetType jest Group . Wartością tego atrybutu byłaby nazwa dowolnej grupy zadeklarowanej w szablonie raportu JRXML.

Wbudowane zmienne raportu

Istnieje kilka wbudowanych zmiennych systemowych, gotowych do użycia w wyrażeniach, jak poniżej -

S.NO Nazwa i opis zmiennej
1

PAGE_NUMBER

Wartością tej zmiennej jest numer bieżącej strony. Może być używany do wyświetlania zarówno bieżący numer strony oraz całkowitą liczbę stron wykorzystujących specjalną funkcję elementów pole tekstowe JasperReports, w evaluationTime atrybutu.

2

COLUMN_NUMBER

Ta zmienna zawiera aktualny numer kolumny.

3

REPORT_COUNT

Ta zmienna raportu zawiera całkowitą liczbę przetworzonych rekordów.

4

PAGE_COUNT

Ta zmienna zawiera liczbę rekordów, które zostały przetworzone podczas generowania bieżącej strony.

5

COLUMN_COUNT

Ta zmienna zawiera liczbę rekordów, które zostały przetworzone podczas generowania bieżącej kolumny.

6

GroupName_COUNT

Nazwa tej zmiennej pochodzi od nazwy grupy, której odpowiada, z przyrostkiem _COUNT. Ta zmienna zawiera liczbę rekordów w bieżącej grupie.

Przykład

Dodajmy zmienną (countNumber) do naszego istniejącego szablonu raportu (Chapter Report Designs ). Będziemy prefiksować liczbę do każdego rekordu. 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">
	
   <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 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" />
            <textElement textAlignment = "Center" verticalAlignment = "Middle" />
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA["  " + String.valueOf($V{countNumber}) +"."+$F{name}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </detail>

</jasperReport>

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 podano 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 podano 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 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 7 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.

BUILD SUCCESSFUL
Total time: 18 seconds

W wyniku powyższej kompilacji otworzy się okno JasperViewer, jak na poniższym ekranie -

Tutaj widzimy, że liczba jest poprzedzona prefiksem dla każdego rekordu.

Omówiliśmy strukturę prostego szablonu raportu w rozdziale Pierwsze kroki . W podobny sposób JasperReports dzieli szablon raportu na wiele sekcji. Sekcje to części raportu, które mają określoną wysokość i mogą zawierać obiekty raportu, takie jak linie, prostokąty, obrazy lub pola tekstowe.

Silnik raportu iteruje przez wirtualne rekordy dostarczonego źródła danych raportu w czasie wypełniania raportu. W zależności od zdefiniowanego zachowania każdej sekcji, silnik renderuje następnie każdą sekcję raportu, gdy jest to konieczne. Na przykład sekcja szczegółów jest renderowana dla każdego rekordu w źródle danych. Gdy występują podziały strony, sekcje nagłówka i stopki strony są renderowane zgodnie z potrzebami.

W JasperReports terminologia i sekcje raportów są również nazywane jako report bands. Sekcje składają się z jednego lub więcej pasm. Sekcje te są wielokrotnie wypełniane w czasie generowania raportu i przygotowują ostateczny dokument.

Główne sekcje

Szablon raportu w JasperReports ma następujące główne sekcje -

<title></title>

<pageheader></pageheader>

<columnheader></columnheader>

<groupheader></groupheader>

<detail></detail>

<groupfooter></groupfooter>

<columnfooter></columnfooter>

<pagefooter></pagefooter>

<lastpagefooter></lastpagefooter>

<summary></summary>

<nodata></nodata>

<background></background>

Poniższa tabela podsumowuje każdą z sekcji -

S.NO Sekcja i opis
1

Title

Ta sekcja pojawia się tylko raz na początku raportu.

2

Page Header

Ta sekcja pojawia się na początku każdej strony w wygenerowanym dokumencie.

3

Column Header

Ta sekcja pojawia się na początku każdej kolumny w wygenerowanym dokumencie. Jeśli raport ma zdefiniowaną tylko jedną kolumnę, sekcje nagłówka i stopki kolumny są ignorowane.

4

Group Header

Ta sekcja jest wprowadzany przez grupę raportu (rozdział grup ). Za każdym razem, gdy wyrażenie grupujące zmienia swoją wartość, sekcja nagłówka grupy jest drukowana nad sekcją szczegółów. W przypadku, gdy zdefiniowano więcej niż jedną grupę, nagłówek grupy jest drukowany w kolejności definicji grupy.

5

Detail

Ta sekcja jest powtarzana dla każdego wiersza danych dostarczonych przez źródło danych raportu. Sekcja szczegółów może składać się z wielu pasków.

6

Group Footer

Ta sekcja jest wprowadzany przez grupę raportu (rozdział grup ). Sekcja stopki grupy jest drukowana poniżej sekcji szczegółów przed zmianą wartości wyrażenia grupującego. Stopka grupy jest zawsze drukowana dla ostatniego wiersza danych w źródle danych. W przypadku, gdy zdefiniowano więcej niż jedną grupę, stopka grupy jest drukowana w kolejności odwrotnej do definicji grupy.

7

Column Footer

Ta sekcja pojawia się na dole każdej kolumny. Jeśli liczba kolumn raportu wynosi 1, sekcje nagłówka i stopki kolumny są ignorowane.

8

Page Footer

Ta sekcja pojawia się u dołu każdej strony.

9

Last Page Footer

Ta sekcja zastępuje zwykłą stopkę strony na ostatniej stronie raportu. W przypadku, gdy sekcja podsumowania jest również obecna, może to nie być ostatnia strona dokumentu. Ta sekcja jest czasami przydatna, gdy informacje podsumowujące muszą być wyświetlane u dołu ostatniej strony.

10

Summary

Ta sekcja pojawia się tylko raz na końcu raportu.

11

No Data

Ta sekcja jest drukowana, gdy właściwość raportu Gdy brak drukowania danych jest ustawiona na Brak sekcji danych . Jeśli sekcja <noData> jest zdefiniowana w szablonie raportu, a źródło danych jest puste, to sekcja <noData> będzie jedyną braną pod uwagę w czasie wypełniania, a jej zawartość da wynik raportu.

12

Background

Sekcja tła jest wyświetlana na każdej stronie i nie może przechodzić do następnej strony. Elementy umieszczone w tej sekcji są oceniane podczas inicjalizacji strony i wyświetlane w tle. Wszystkie inne obiekty strony są wyświetlane na wierzchu obiektów tła. Ta sekcja jest przydatna do tworzenia znaków wodnych stron.

Sekcja, elementy i relacja atrybutów

Poniższy diagram przedstawia relacje elementów i atrybutów w sekcji raportu.

Elementy przekroju

Wszystkie wyżej wymienione sekcje raportu są opcjonalne. Ale każdy szablon raportu będzie miał co najmniej jedną taką sekcję. Każda z tych sekcji zawiera jeden <band> jako jedyny element podrzędny. A <band> może zawierać zero lub więcej następujących elementów podrzędnych -

<line>, <rectangle>, <ellipse>, <image>, <staticText>, <textField>, <subReport> lub <elementGroup>

Każdy z tych elementów musi zawierać pojedynczy znak <reportElement> jako pierwszy element (z wyjątkiem elementu elementGroup). A <reportElement> określa sposób rozmieszczenia danych dla danego elementu. W przeciwieństwie do zmiennych i parametrów, elementy raportu nie muszą mieć nazwy, ponieważ zwykle nie ma potrzeby uzyskiwania żadnego pojedynczego elementu w szablonie raportu.

Poniższa tabela zawiera podsumowanie atrybutów <reportElement> -

Atrybut Opis Prawidłowe wartości
x Określa współrzędną x elementu pasma. Wartość całkowita wskazująca współrzędną x elementu w pikselach. Ten atrybut jest wymagany.
y Określa współrzędną y elementu pasma. Wartość całkowita wskazująca współrzędną y elementu w pikselach. Ten atrybut jest wymagany.
szerokość Określa szerokość elementu pasmowego. Wartość całkowita wskazująca szerokość elementu w pikselach. Ten atrybut jest wymagany.
wysokość Określa wysokość elementu pasmowego. Wartość całkowita wskazująca wysokość elementu w pikselach. Ten atrybut jest wymagany.
klucz Niepowtarzalny identyfikator elementu pasma. Unikalna wartość ciągu.
stretchType Określa, w jaki sposób element jest rozciągany, gdy zawiera się pasmo

NoStretch (default) - Element nie będzie się rozciągał.

RelativeToTallestObject - Element zostanie rozciągnięty, aby pomieścić najwyższy obiekt w swojej grupie.

RelativeToBand - Element będzie się rozciągał, aby dopasować się do wysokości opaski.

Typ pozycji Określa pozycję elementu, gdy pasmo się rozciąga.

Float - Element będzie się przesuwał w zależności od wielkości otaczających elementów.

FixRelativeToTop (default) - Element zachowa stałą pozycję w stosunku do góry opaski.

FixRelativeToBottom - Element będzie utrzymywał stałą pozycję względem spodu opaski.

isPrintRepeatedValues Określa, czy drukowane są powtarzające się wartości.

true (default) - Wydrukowane zostaną wartości powtarzane.

false - Wielokrotne wartości nie zostaną wydrukowane.

tryb Określa tryb tła elementu Nieprzezroczysty, przezroczysty
isRemoveLineWhenBlank Określa, czy element powinien zostać usunięty, gdy jest pusty i nie ma innych elementów w tej samej poziomej przestrzeni. prawda fałsz
isPrintInFirstWholeBand Określa, czy element ma być drukowany w całym paśmie, czyli w paśmie, który nie jest podzielony między strony zestawienia lub kolumny. prawda fałsz
isPrintWhenDetailOverFlows Określa, czy element zostanie wydrukowany, gdy pasmo przejdzie do nowej strony lub kolumny. prawda fałsz
printWhenGroupChanges Określa, że ​​element zostanie wydrukowany po zmianie określonej grupy. Wartość ciągu.
kolor Określa kolor pierwszego planu elementu. Szesnastkowa wartość RGB poprzedzona znakiem # lub jedna z następujących predefiniowanych wartości: czarny, niebieski, cyjan, ciemnoszary, szary, zielony, jasnoszary, magenta, pomarańczowy, różowy, czerwony, żółty, biały.
kolor tła Określa kolor tła elementu. Takie same, jak prawidłowe wartości dla forecolor

Atrybuty sekcji

Poniżej znajdują się atrybuty sekcji raportu -

Wysokość

Wysokość sekcji określa wysokość w pikselach dla tej konkretnej sekcji i jest bardzo ważna w ogólnym projekcie raportu.

Drukuj, gdy wyrażenie

Wyrażenie logiczne, które określa, czy sekcja powinna zostać wydrukowana, czy nie.

Podział dozwolony

Flaga wskazująca, czy sekcja może się podzielić, jeśli nie mieści się na bieżącej stronie. Jeśli tak, sekcja zostanie przeniesiona na następną stronę. Zwróć uwagę, że w przypadku, gdy sekcja nie zmieści się na następnej stronie, sekcja zostanie podzielona niezależnie od wartości flagi. splitType może przyjmować następujące wartości -

  • splitType = "Stretch:" Dzieli rozciągniętą zawartość. Jeśli sekcja rozciąga się na bieżącej stronie (jeśli dostępne miejsce jest mniejsze niż zadeklarowana wysokość), region dodawany do pierwotnej wysokości może zostać podzielony na następną stronę.

  • splitType = "Prevent:" Zapobiegaj podziałowi przy pierwszej próbie. Jeśli sekcja nie mieści się na następnej stronie, podział następuje normalnie, ponieważ zapobieganie podziałowi pasma jest skuteczne tylko przy pierwszej próbie podziału.

  • splitType = "Immediate:" Podziel natychmiast. Wstęga może się rozdzielić w dowolnym miejscu poza powyższym, jej najwyższym elementem.

Przykład

Aby zademonstrować każdą sekcję, napiszmy szablon raportu (jasper_report_template.jrxml). Zapisz ten plik wC:\tools\jasperreports-5.0.1\testinformator. W tym pliku będziemy wyświetlać tekst w każdej z sekcji (omówiliśmy powyżej). Zawartość pliku jest taka, jak podano poniżej -

<?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 = "jasper_report_template" pageWidth = "300" pageHeight = "300" 
   columnWidth = "300" leftMargin = "0" rightMargin = "0" 
   topMargin = "0" bottomMargin = "0" >

   <title>
      <band height = "50">
         
         <textField>
            <reportElement x = "100" y = "16" width = "100" height = "20"/>
            <textElement/>
            
            <textFieldExpression>
               <![CDATA["Title"]]>
            </textFieldExpression>
        
         </textField>
      
      </band>
   </title>
   
   <pageHeader>
      <band height = "40">
         
         <textField>
            <reportElement  mode = "Opaque" x = "100" y = "10" 
               width = "90" height = "20"/>
            
            <textElement>
               <font isBold = "true"/>
            </textElement>
            
            <textFieldExpression>
               <![CDATA["Page Header"]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </pageHeader>
   
   <columnHeader>
      <band height = "40">
            
         <textField>
            <reportElement  x = "100" y = "10" width = "90" height = "20"/>
            
            <textElement>
               <font isItalic = "true"/>
            </textElement>
            
            <textFieldExpression>
               <![CDATA["Column Header"]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </columnHeader>
   
   <detail>
      <band height ="40">
         
         <textField>
            <reportElement mode = "Opaque" x = "100" y = "10" 
               width = "90" height = "20" backcolor = "#99CCFF"/>
            <textElement/>
            
            <textFieldExpression>
               <![CDATA["Report Details"]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </detail>
   
   <columnFooter>
      <band height = "40">
         
         <textField>
            <reportElement  x = "100" y = "10" width = "90" height = "20"/>
            <textElement/>
            
            <textFieldExpression>
               <![CDATA["Column Footer"]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </columnFooter>
   
   <pageFooter>
      <band height = "40">
         
         <textField>
            <reportElement  x = "100" y = "10" width = "90" height = "20"/>
            <textElement/>
            
            <textFieldExpression>
               <![CDATA["Page Footer"]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </pageFooter>
   
   <lastPageFooter>
      <band height = "40">
         
         <textField>
            <reportElement  x = "100" y = "10" width = "90" height = "20"/>
            <textElement/>
            
            <textFieldExpression>
               <![CDATA["Last Page Footer"]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </lastPageFooter>
   
   <summary>
      <band height = "40">
         
         <textField>
            <reportElement  x = "100" y = "10" width = "90" height = "20"/>
            <textElement/>
            
            <textFieldExpression>
               <![CDATA["Summary"]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </summary>
	
</jasperReport>

Poniżej podano kod java do wypełnienia i wygenerowania raportu. Zapiszmy ten plikJasperReportFill.java do katalogu C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint.

package com.tutorialspoint;

import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;

public class JasperReportFill {
   public static void main(String[] args) {
      String sourceFileName = "C://tools/jasperreports-5.0.1/test/" + 
         "jasper_report_template.jasper";

      try {
         JasperFillManager.fillReportToFile(sourceFileName, null,
            new JREmptyDataSource());
      } catch (JRException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }

   }
}

W tym przypadku używamy instancji JREmptyDataSource podczas wypełniania raportów, aby symulować źródło danych z jednym rekordem, ale wszystkie pola w tym pojedynczym rekordzie mają wartość NULL.

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 następująca.

Plik importu - baseBuild.xml jest pobierany z rozdziału Konfiguracja środowiska i należy go umieścić w tym samym katalogu co 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 (viewFullReport jest domyślnym celem) w następujący sposób -

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, defau
   [javac] Compiling 1 source file 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.JRXmlDigesterFac
   [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.ExtensionsEnviro
   [java] log4j:WARN Please initialize the log4j system properly.

viewFillReport:
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnviro
   [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 18 minutes 22 seconds

W wyniku powyższej kompilacji otworzy się okno JasperViewer, jak na poniższym ekranie -

Tutaj widzimy, że w każdej sekcji drukowany jest tekst. Należy zauważyć, że ponieważ JRXML zawiera element <lastPageFooter>, będzie on wyświetlany na ostatniej stronie raportu zamiast elementu <pageFooter>. Elementy <columnHeader> i <columnFooter> będą wyświetlane w raporcie tylko wtedy, gdy ma więcej niż jedną kolumnę.

Grupy w JasperReports pomagają uporządkować dane w raporcie w logiczny sposób. Grupa raportów reprezentuje sekwencję kolejnych rekordów w źródle danych, które mają coś wspólnego, na przykład wartość określonych pól raportu. Grupa raportów jest definiowana przez element <group>. Raport może mieć dowolną liczbę grup. Po zadeklarowaniu grup można kierować w całym raporcie.

Grupa raportów składa się z trzech elementów -

  • Wyrażenie grupy - wskazuje dane, które muszą ulec zmianie, aby rozpocząć nową grupę danych.

  • Sekcja nagłówka grupy - pomaga umieścić etykietę na początku zgrupowanych danych.

  • Sekcja stopki grupy - pomaga umieścić etykietę na końcu zgrupowanych danych.

Podczas iteracji przez źródło danych w czasie wypełniania raportu, jeśli wartość wyrażenia grupy ulegnie zmianie, nastąpi zerwanie grupy i odpowiednie sekcje <groupFooter> i <groupHeader> zostaną wstawione do wynikowego dokumentu.

Mechanizm grup raportów nie dokonuje sortowania danych dostarczonych przez źródło danych. Grupowanie danych działa zgodnie z oczekiwaniami tylko wtedy, gdy rekordy w źródle danych są już uporządkowane zgodnie z wyrażeniami grupy używanymi w raporcie.

Atrybuty grupowe

Element <group> zawiera atrybuty, które pozwalają nam kontrolować sposób ułożenia pogrupowanych danych. Atrybuty podsumowano w poniższej tabeli -

S.NO Atrybut i opis
1

name

To jest obowiązkowe. Odwołuje się do grupy w wyrażeniach raportu według nazwy. Jest zgodny z tymi samymi konwencjami nazewnictwa, które wspomnieliśmy dla parametrów raportu, pól i zmiennych raportu. Może być używany w innych atrybutach JRXML, gdy chcesz odnieść się do określonej grupy raportów.

2

isStartNewColumn

Po ustawieniu wartości true każda grupa danych rozpocznie się w nowej kolumnie. Wartość domyślna to false .

3

isStartNewPage

W przypadku ustawienia true każda grupa danych rozpocznie się na nowej stronie. Wartość domyślna to false .

4

isResetPageNumber

W przypadku ustawienia wartości prawda numer strony raportu będzie resetowany za każdym razem, gdy rozpocznie się nowa grupa. Wartość domyślna to false.

5

isReprintHeaderOnEachPage

W przypadku ustawienia wartości true nagłówek grupy będzie ponownie drukowany na każdej stronie. Wartość domyślna to false .
6

minHeightToStartNewPage

Definiuje minimalną ilość miejsca w pionie potrzebną na dole kolumny, aby umieścić nagłówek grupy w bieżącej kolumnie. Kwota jest określona w jednostkach raportu.

7

footerPosition

Renderuje pozycję stopki grupy na stronie, a także jej zachowanie w stosunku do sekcji raportu, które następują po niej. Może mieć wartości: Normal , StackAtBottom , ForceAtBottom i CollateAtBottom . Wartość domyślna to Normalny .

8

keepTogether

Ustawienie wartości true zapobiega podziałowi grupy przy pierwszej próbie przerwania.

Przykład

Dodajmy grupę (CountryGroup) do istniejącego szablonu raportu (Rozdział Projekty raportów ). Występowanie każdego kraju jest zliczane, a liczba jest wyświetlana jako stopka grupy. W nagłówku grupy liczba każdego rekordu jest poprzedzona prefiksem. 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">

   <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>
   
   <sortField name = "country" order = "Descending"/>
   <sortField name = "name"/>
   
   <variable name = "CountryNumber" class = "java.lang.Integer"
      incrementType = "Group" incrementGroup = "CountryGroup"
      calculation = "Count">
      <variableExpression><![CDATA[Boolean.TRUE]]></variableExpression>
   </variable>
   
   <group name = "CountryGroup" minHeightToStartNewPage = "60">
      <groupExpression><![CDATA[$F{country}]]></groupExpression> <groupHeader> <band height = "20"> <textField evaluationTime = "Group" evaluationGroup = "CountryGroup" bookmarkLevel = "1"> <reportElement mode = "Opaque" x = "0" y = "5" width = "515" height = "15" backcolor = "#C0C0C0"/> <box leftPadding = "10"> <bottomPen lineWidth = "1.0"/> </box> <textElement/> <textFieldExpression class = "java.lang.String"> <![CDATA[" " + String.valueOf($V{CountryNumber}) + ". "
                  + String.valueOf($F{country})]]> </textFieldExpression> <anchorNameExpression> <![CDATA[String.valueOf($F{country})]]>
               </anchorNameExpression>
            </textField>
         
         </band>
      </groupHeader>
      
      <groupFooter>
         <band height = "20">
            
            <staticText>
               <reportElement x = "400" y = "1" width = "60" height = "15"/>
               <textElement textAlignment = "Right"/>
               <text><![CDATA[Count :]]></text>
            </staticText>
            
            <textField>
               <reportElement x = "460" y = "1" width = "30" height = "15"/>
               <textElement textAlignment = "Right"/>
               
               <textFieldExpression class = "java.lang.Integer">
                  <![CDATA[$V{CountryGroup_COUNT}]]> </textFieldExpression> </textField> </band> </groupFooter> </group> <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 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" />
            <textElement textAlignment = "Center" verticalAlignment = "Middle" />
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{name}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </detail>
	
</jasperReport>

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 podano 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 następująca.

Plik importu - baseBuild.xml jest pobierany z rozdziału Konfiguracja środowiska i powinien być umieszczony w tym samym katalogu co 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 7 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.

BUILD SUCCESSFUL
Total time: 18 seconds

W wyniku powyższej kompilacji otworzy się okno JasperViewer, jak na poniższym ekranie -

Tutaj widzimy, że każdy kraj jest zgrupowany, a liczba wystąpień każdego kraju jest wyświetlana w stopce każdej grupy.

Raport zawiera elementy tekstowe, a każdy z nich może mieć własne ustawienia czcionek. Te ustawienia można określić za pomocą <font> dostępny w tagu <textElement>. Raport może definiować liczbę czcionek. Po zdefiniowaniu można ich używać jako domyślnych lub podstawowych ustawień czcionek dla innych definicji czcionek w całym raporcie.

Zgłoś czcionki

Czcionka raportu to zbiór ustawień czcionek zadeklarowanych na poziomie raportu. Czcionkę raportu można ponownie wykorzystać w całym szablonie raportu podczas ustawiania właściwości czcionki elementów tekstowych.

Czcionki raportów są teraz przestarzałe. Nie używaj elementów <reportFont /> zadeklarowanych w samym dokumencie. Zamiast tego użyj elementu <style />.

Atrybuty czcionek

Poniższa tabela zawiera podsumowanie głównych atrybutów <font> element -

S.NO Atrybut i opis
1

fontName

Nazwa czcionki, która może być nazwą czcionki fizycznej, logicznej lub nazwą rodziny czcionek z zarejestrowanych rozszerzeń czcionek JasperReports.

2

size

Wielkość czcionki mierzona w punktach. Domyślnie 10.

3

isBold

Flaga określająca, czy wymagana jest pogrubiona czcionka. Domyślnie jest to fałsz.

4

isItalic

Flaga określająca, czy wymagana jest kursywa. Domyślnie jest to fałsz.

5

isUnderline

Flaga określająca, czy wymagane jest podkreślenie tekstu. Domyślnie jest to fałsz.

6

isStrikeThrough

Flaga określająca, czy wymagana jest dekoracja tekstu przekreślonego. Domyślnie jest to fałsz.

7

pdfFontName

Nazwa równoważnej czcionki PDF wymaganej przez bibliotekę iText podczas eksportowania dokumentów do formatu PDF.

8

pdfEncoding

Równoważne kodowanie znaków PDF, również wymagane przez bibliotekę iText.

9

isPdfEmbedded

Flaga określająca, czy czcionka powinna być osadzona w samym dokumencie. Domyślnie jest to fałsz. Jeśli ustawione na true, pomaga przeglądać dokument PDF bez żadnego problemu.

Typy czcionek

W JasperReports czcionki można podzielić na -

  • Logical Fonts- Pięć typów czcionek, które zostały rozpoznane przez platformę Java od wersji 1.0, nazywa się czcionkami logicznymi. To są -Serif, SansSerif, Monospaced, Dialog, and DialogInput. Te czcionki logiczne nie są rzeczywistymi bibliotekami czcionek zainstalowanymi w dowolnym miejscu w systemie. Są to jedynie nazwy typów czcionek rozpoznawane przez środowisko wykonawcze Java. Muszą być one odwzorowane na jakąś fizyczną czcionkę zainstalowaną w systemie.

  • Physical Fonts- Te czcionki to rzeczywiste biblioteki czcionek składające się na przykład z czcionek TrueType lub PostScript Type 1. Fizyczne czcionki mogą być czcionkami Arial, Time, Helvetica, Courier lub dowolną liczbą innych czcionek, w tym czcionkami międzynarodowymi.

  • Font Extensions- Biblioteka JasperReports może korzystać z czcionek zarejestrowanych w locie w czasie wykonywania, dzięki wbudowanej obsłudze rozszerzeń czcionek. Listę rodzin czcionek można udostępnić w JasperReports za pomocą rozszerzenia czcionki. Są one wykonane z podobnie wyglądających czcionek i obsługują określone ustawienia regionalne.

Jak opisano w powyższej tabeli, musimy określić w atrybucie fontName nazwę czcionki fizycznej, nazwę czcionki logicznej lub nazwę rodziny czcionek z zarejestrowanych rozszerzeń czcionek JasperReports.

Nazwa czcionki PDF

Biblioteka JasperReports korzysta z biblioteki iText podczas eksportowania raportów do formatu PDF (Portable Document Format). Pliki PDF można wyświetlać na różnych platformach i zawsze będą wyglądać tak samo. Dzieje się tak częściowo dlatego, że w tym formacie istnieje specjalny sposób postępowania z czcionkami. Atrybut fontName nie jest przydatny podczas eksportowania do formatu PDF. Atrybut pdfFontName istnieje tam, gdzie musimy określić ustawienia czcionki.

Biblioteka iText wie, jak radzić sobie z wbudowanymi czcionkami i plikami TTF i rozpoznaje następujące wbudowane nazwy czcionek -

  • Courier
  • Courier-Bold
  • Courier-BoldOblique
  • Courier-Oblique
  • Helvetica
  • Helvetica-Bold
  • Helvetica-BoldOblique
  • Helvetica-Oblique
  • Symbol
  • Times-Roman
  • Times-Bold
  • Times-BoldItalic
  • Times-Italic
  • ZapfDingbats

Zgodnie z wymogiem wstępnym biblioteki iText, aby pracować z czcionkami, musimy określić jedną z następujących nazw jako nazwę czcionki -

  • Wbudowana nazwa czcionki z powyższej listy.

  • Nazwa pliku TTF (True Type Font), który można zlokalizować na dysku.

  • Prawdziwa nazwa czcionki, pod warunkiem, że plik TTF zawierający czcionkę został wcześniej zarejestrowany w iText lub że podczas rejestracji czcionki został zdefiniowany alias.

W oparciu o powyższe wymagania wstępne atrybut pdfFontName może zawierać jedną z następujących wartości -

  • Nazwa wbudowanej czcionki PDF z powyższej listy.

  • Nazwa pliku TTF, który może znajdować się na dysku w czasie wykonywania podczas eksportowania do formatu PDF.

  • Prawdziwa nazwa zarejestrowanej czcionki.

  • Sufiks klucza (część po net.sf.jasperreports.export.pdf.font ) dla czcionki zarejestrowanej w iText jako plik czcionki.

Domyślne czcionki i dziedziczenie

Każdy element tekstowy dziedziczy atrybuty czcionki i stylu po swoim elemencie nadrzędnym, który z kolei dziedziczy te atrybuty po swoim nadrzędnym. Jeśli dla elementów nie zdefiniowano żadnych stylów i / lub czcionek, zostanie zastosowany styl domyślny (i / lub czcionka - ale jest to obecnie przestarzałe) zadeklarowane w elemencie głównym <jasperReport />.

Definiowanie domyślnych stylów lub czcionek w JasperReports nie jest obowiązkowe. Jeśli dla danego elementu nie jest zdefiniowana żadna czcionka, silnik szuka odziedziczonych atrybutów czcionki lub, jeśli w ten sposób nie ma żadnych atrybutów, szuka właściwości net.sf.jasperreports.default.font.name w / Plik src / default.jasperreports.properties . Jego wartość określa nazwę rodziny czcionek, która ma być używana, gdy właściwości czcionki nie są jawnie zdefiniowane dla elementu tekstowego lub dziedziczone po jego rodzica.

Główne domyślne właściwości czcionek i ich wartości zdefiniowane w pliku /src/default.jasperreports.properties znajdują się w poniższej tabeli -

własność Opis
net.sf.jasperreports.default.font.name = SansSerif Domyślna nazwa czcionki.
net.sf.jasperreports.default.font.size = 10 Domyślny rozmiar czcionki.
net.sf.jasperreports.default.pdf.font.name = Helvetica Domyślna czcionka PDF.
net.sf.jasperreports.default.pdf.encoding = Cp1252 Domyślne kodowanie znaków PDF.
net.sf.jasperreports.default.pdf.embedded = false Domyślnie czcionki PDF nie są osadzane.

Przykład

Aby zademonstrować użycie czcionek i atrybutów czcionek w celu uzyskania określonego wyglądu tekstu, napiszmy nowy szablon raportu (jasper_report_template.jrxml). Zawartość JRXML jest jak poniżej. Zapisz go w katalogu C: \ tools \ jasperreports-5.0.1 \ test. Tutaj w tytule raportu wyświetlimy tekst w różnych formatach czcionek.

<?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 = "jasper_report_template" pageWidth = "595" pageHeight = "842"
   columnWidth = "555" leftMargin = "20" rightMargin = "20" topMargin = "30"
   bottomMargin = "30">

   <title>
      <band height = "682">
      
      <staticText>
         <reportElement x = "0" y = "50" width = "150" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[Welcome to TutorialsPoint!]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "50" width = "390" height = "40"/>
         <textElement/>
         
         <text>
           <![CDATA[<staticText>
           <reportElement x = "0" y = "50" width = "150" height = "40"/>
           <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "0" y = "100" width = "150" height = "40"/>
         
         <textElement>
            <font size = "12"/>
         </textElement>
         
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "100" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "100" width = "150" height = "40"/>
            
            <textElement>
               <font size = "14"/>
            </textElement>
				
            <text> Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "0" y = "150" width = "150" height = "40"/>
         
         <textElement>
            <font fontName = "DejaVu Serif" size = "12" isBold = "false"/>
         </textElement>
			
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "150" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "250" width = "150" height = "40"/>
            
            <textElement>
               <font fontName = "DejaVu Serif" size = "12" isBold = "false"/>
            </textElement>
				
            <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "0" y = "200" width = "150" height = "40"/>
         
         <textElement>
            <font fontName = "DejaVu Serif" size = "12" isBold = "true"/>
         </textElement>
			
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "200" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "300" width = "150" height = "40"/>
            
            <textElement>
               <font fontName = "DejaVu Serif" size = "12" isBold = "true"/>
            </textElement>
				
            <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "0" y = "250" width = "150" height = "40"/>
         
         <textElement>
            <font fontName = "Monospaced" size = "12" isItalic = "true" 
               isUnderline = "true" pdfFontName = "Courier-Oblique"/>
         </textElement>
         
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "250" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "350" width = "150" height = "40"/>
            
            <textElement>
               <font fontName = "Monospaced" size = "12" isItalic = "true"
                  isUnderline = "true" pdfFontName = "Courier-Oblique"/>
            </textElement>
            
            <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "0" y = "300" width = "150" height = "40"/>
         
         <textElement>
            <font fontName = "Monospaced" size = "12" isBold = "true"
               isStrikeThrough = "true" pdfFontName = "Courier-Bold"/>
         </textElement>
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "300" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "400" width = "150" height = "40"/>
            
            <textElement>
               <font fontName = "Monospaced" size = "12" isBold = "true"
                  isStrikeThrough = "true" pdfFontName = "Courier-Bold"/>
            </textElement>
				
            <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "0" y = "350" width = "150" height = "40" 
            forecolor = "#FF0000"/>
         
         <textElement>
            <font size = "14"/>
         </textElement>
			
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "350" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "450" width = "150" height = "40"
               forecolor = "red"/>
            
            <textElement><font size = "14"/></textElement>
            <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "0" y = "400" width = "150" height = "40" mode = "Opaque"
            forecolor = "#00FF00" backcolor = "#FFFF00"/>
         
         <textElement>
            <font fontName = "Serif" size = "12" isBold = "true" 
               pdfFontName = "Times-Bold"/>
         </textElement>
			
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "400" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "500" width = "150" height = "40"
               forecolor = "green" backcolor = "#FFFF00" mode = "Opaque"/>
            
            <textElement>
               <font fontName = "Serif" size = "12" isBold = "true"
                  pdfFontName = "Times-Bold"/>
            </textElement>
				
            <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "0" y = "450" width = "150" height = "40" mode = "Opaque"
            forecolor = "#0000FF" backcolor = "#FFDD99"/>
         
         <textElement textAlignment = "Center" verticalAlignment = "Middle">
            <font fontName = "SansSerif" size = "12" isBold = "false"
            isItalic = "true" pdfFontName = "Sans.Slanted" isPdfEmbedded = "true"/>
         </textElement>
			
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "450" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "550" width = "150" height = "90"
               forecolor = "blue" backcolor = "#FFDD99" mode = "Opaque"/>
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font fontName = "SansSerif" size = "12" isBold = "false"
                  pdfFontName = "Sans.Slanted" isPdfEmbedded = "true"/>
            </textElement>
				
            <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement mode = "Opaque" x = "0" y = "500" width = "150" height = "40"
            forecolor = "#FF0000" backcolor = "#99DDFF"/>
         
         <textElement textAlignment = "Right" verticalAlignment = "Bottom">
            <font fontName = "SansSerif" size = "12" isBold = "true"
               pdfFontName = "DejaVu Sans Bold" isPdfEmbedded = "true"/>
         </textElement>
			
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "500" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "650" width = "150" height = "90"    forecolor = "red"
               backcolor = "#99DDFF" mode = "Opaque"/>
            
            <textElement textAlignment = "Right" verticalAlignment = "Bottom">
               <font fontName = "SansSerif" size = "12" isBold = "true"
                  pdfFontName = "DejaVu Sans Bold" isPdfEmbedded = "true"/>
            </textElement>
				
            <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      
      </staticText>
   
   </band>
</title>

</jasperReport>

Kod java do wypełnienia i wygenerowania raportu jest podany poniżej. Zapiszmy ten plikJasperFontsReportFill.java do katalogu C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint.

package com.tutorialspoint;

import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;

public class JasperFontsReportFill {
   public static void main(String[] args) {
      String sourceFileName = "C://tools/jasperreports-5.0.1/test/" + 
         "jasper_report_template.jasper";

      try {
         JasperFillManager.fillReportToFile(sourceFileName, null,
            new JREmptyDataSource());
      } catch (JRException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }

   }
}

Tutaj używamy instancji JREmptyDataSource podczas wypełniania raportów, aby symulować źródło danych z jednym rekordem, ale wszystkie pola mają wartość null .

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 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.JasperFontsReportFill (domyślnym celem jest viewFullReport) jako -

C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.tutorialspoint.JasperFontsReportFill
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.
   [javac] Compiling 5 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.JasperFontsReportFill
   [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.

BUILD SUCCESSFUL
Total time: 45 minutes 3 seconds

W wyniku powyższej kompilacji otworzy się okno JasperViewer, jak pokazano na poniższym ekranie -

Tutaj widzimy, że tekst „Witamy w TutorialsPoint” jest wyświetlany w różnych formatach czcionek.

W JasperReports praca z tekstami wymaga specjalnych narzędzi do przetwarzania zarówno reprezentacji znaków, jak i właściwości formatowania tekstu. Każdy tekst może być traktowany jako ciąg znaków o określonej strukturze reprezentacji. Wygląd tekstu składa się zarówno z układu (i akapitu), jak i ustawień czcionki. Ale chociaż w większości przypadków układ tekstu pozostaje niezmienny, ustawienia czcionek mogą ulec zmianie podczas uruchamiania raportu w różnych lokalizacjach.

Wiemy, że różne języki wymagają różnych zestawów znaków w odniesieniu do określonych reprezentacji znaków. Dlatego praca z tekstami oznacza pracę z czcionkami. Jednak szczegółowa dyskusja na temat korzystania z czcionek w JasperReports jest dostępna w rozdziale Czcionki raportów .

Jedną z głównych cech dotyczących treści tekstu w danym raporcie jest możliwość jego umiędzynarodowienia. Oznacza to, że możemy uruchomić raport w różnych zlokalizowanych środowiskach, używając różnych języków i innych ustawień lokalizacyjnych bez żadnych zmian na stałe. Kodowanie znaków jest ważną funkcją, gdy raport ma być umiędzynarodowiony.

Kodowanie znaków

Znak to najmniejsza jednostka pisma zawierająca znaczącą informację. Jest to koncepcja abstrakcyjna, postać nie ma wyglądu. „Wielka litera łacińska A” to inny znak niż „mała litera łacińska a” oraz „wielka litera cyrylicy A” i „duża litera grecka alfa”.

Wizualna reprezentacja postaci jest znana jako glyph. Pewien zestaw glifów nazywany jest afont. „Wielkie litery alfabetu łacińskiego A”, „wielkie litery cyrylicy A” i „wielkie litery alfabetu greckiego” mogą mieć identyczne glify, ale są to różne znaki. W tym samym czasie glify „wielkiej łaciny A” mogą wyglądać zupełnie inaczej w czcionkach Times New Roman, Gill Sans i Poetica chancery italic, ale nadal reprezentują ten sam znak.

Zestaw dostępnych znaków nazywany jest repertuarem postaci . Lokalizacja (indeks) danego znaku w repertuarze nazywana jest jego pozycją kodową lub punktem kodowym. Metoda numerycznego reprezentowania punktu kodowego w ramach danego repertuaru nosi nazwęcharacter encoding.

Kodowania są zwykle wyrażane w oktetach. Oktet to grupa ośmiu cyfr binarnych, tj. Ośmiu jedynek i zer. Oktet może wyrazić zakres liczbowy od 0 do 255 lub od 0x00 do 0xFF, aby użyć notacji szesnastkowej.

Unicode

Unicode to repertuar znaków, który zawiera większość znaków używanych w językach świata. Może pomieścić miliony postaci i zawiera już setki tysięcy. Unicode jest podzielony na „płaszczyzny” o długości 64 tys. Znaków. Jedynym używanym w większości przypadków jest pierwszy samolot, znany jako podstawowa płaszczyzna wielojęzyczna lub BMP.

UTF-8 jest zalecanym kodowaniem. Używa zmiennej liczby oktetów do reprezentowania różnych znaków.

W pliku JRXML atrybut kodowania jest określony w nagłówku. Jest używany w czasie kompilacji raportu do dekodowania zawartości XML. Na przykład, jeśli raport zawiera tylko francuskie słowa i znaki takie jak ç, é, â, wówczas kodowanie ISO-8859-1 (aka Latin-1) jest wystarczające -

<?xml version = "1.0" encoding = "ISO-8859-1"?>

Jak widać powyżej, idealnie byłoby dobrać kodowanie do minimalnego zestawu znaków, który może poprawnie reprezentować wszystkie znaki w dokumencie. Natomiast w przypadku dokumentów wielojęzycznych (tj. Dokumentów zawierających wyrazy pisane w kilku językach) należy wybrać kodowanie dostosowane do minimalnego zestawu znaków, zdolnego do poprawnej reprezentacji wszystkich znaków w dokumencie, nawet jeśli należą one do różnych języków. Jednym z kodowań znaków umożliwiających obsługę dokumentów wielojęzycznych jestUTF-8, używana jako domyślna wartość kodowania przez JasperReports.

Teksty są zwykle przechowywane w plikach pakietów zasobów, a nie w dokumencie podczas internacjonalizacji. Tak więc istnieją przypadki, w których sam JRXML wygląda na całkowicie zgodny z ASCII, ale generowane raporty w czasie wykonywania zawierają teksty nieczytelne w ASCII. W rezultacie w przypadku określonego typu formatów eksportu dokumentów (takich jak CSV, HTML, XHTML, XML i tekst) należy również znać kodowanie wygenerowanego dokumentu. Różne języki są obsługiwane przez różne kodowania znaków. Dlatego za każdym razem musimy uruchomić raport w zlokalizowanym środowisku. Ponadto musimy wiedzieć, które kodowanie znaków jest najbardziej odpowiednie dla generowanego języka dokumentu. W takim przypadku właściwość kodowania zdefiniowana w samym pliku JRXML może nie być już użyteczna.

Aby rozwiązać tego rodzaju problemy, możemy użyć właściwości klienta eksportu znanej jako net.sf.jasperreports.export.character.encoding . Ta niestandardowa właściwość eksportu ma wartość domyślną UTF-8 i jest obecna w JasperReports.

Ta wartość domyślna jest ustawiona w pliku default.jasperreports.properties . Aby uzyskać bardziej szczegółowe opcje w czasie eksportu, dostępny jest również parametr eksportu CHARACTER_ENCODING.

Przykład

Aby zademonstrować użycie obsługi Unicode w Jasperreports, napiszmy nowy szablon raportu (jasper_report_template.jrxml). Save it to C:\tools\jasperreports-5.0.1\testinformator. Tutaj wyświetlimy tekst w różnych językach przy użyciu znaków Unicode (\ uXXXX). Dowolny znak zakodowany w UTF-8 może być reprezentowany tylko za pomocą 4-cyfrowego kodu szesnastkowego. Na przykład grecką literę Γ można zapisać jako \ u0393. Gdy taka notacja zostanie napotkana, silnik zażąda odpowiedniej reprezentacji znaku w zestawie znaków i tylko ten konkretny znak zostanie wydrukowany. Zawartość JRXML jest jak poniżej -

<?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 = "jasper_report_template" language = "groovy" pageWidth = "595"
   pageHeight = "842" columnWidth = "555" leftMargin = "20" rightMargin = "20"
   topMargin = "20" bottomMargin = "20">

   <parameter name = "GreekText" class = "java.lang.String" isForPrompting = "false">
      <defaultValueExpression><![CDATA["\u0394\u03B5\u03BD "+
         "\u03BA\u03B1\u03C4\u03B1\u03BB\u03B1\u03B2\u03B1\u03AF"+
         "\u03BD\u03C9 \u0395\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC"]]>
      </defaultValueExpression>
   </parameter>
   
   <parameter name = "CyrillicText" class = "java.lang.String" isForPrompting = "false">
      <defaultValueExpression><![CDATA["\u042F \u043D\u0435 "+
         "\u043C\u043E\u0433\u0443 \u043F\u043E\u043D\u044F\u0442\u044C "+
         "\u0433\u0440\u0435\u0447\u0435\u0441\u043A\u0438\u0439"]]>
      </defaultValueExpression>
   </parameter>

   <parameter name = "ArabicText" class = "java.lang.String" isForPrompting = "false">
      <defaultValueExpression><![CDATA["\u0627\u0646\u0646\u0649 \u0644\u0627 "+
         "\u0627\u0641\u0647\u0645 \u0627\u0644\u0644\u063A\u0629 "+
         "\u0627\u0644\u0639\u0631\u0628\u064A\u0629"]]>
      </defaultValueExpression>
   </parameter>
   
   <parameter name = "HebrewText" class = "java.lang.String" isForPrompting = "false">
      <defaultValueExpression><![CDATA["\u05D0\u05E0\u05D9 \u05DC\u05D0 "+
         "\u05DE\u05D1\u05D9\u05DF \u05E2\u05D1\u05E8\u05D9\u05EA"]]>
      </defaultValueExpression>
   </parameter>
   
   <title>
      <band height = "782">
         
         <textField>
            <reportElement x = "0" y = "50" width = "200" height = "60"/>
            
            <textElement>
               <font fontName = "DejaVu Sans" size = "14"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{GreekText} + "\n" + $P{CyrillicText}]]> </textFieldExpression> </textField> <staticText> <reportElement x = "210" y = "50" width = "340" height = "60"/> <textElement/> <text> <![CDATA["GreekText and CyrillicText"]]> </text> </staticText> <textField> <reportElement x = "0" y = "120" width = "200" height = "60"/> <textElement> <font fontName = "DejaVu Sans" size = "14" isBold = "true"/> </textElement> <textFieldExpression class = "java.lang.String"> <![CDATA[$P{GreekText} + "\n" + $P{CyrillicText}]]> </textFieldExpression> </textField> <staticText> <reportElement x = "210" y = "120" width = "340" height = "60"/> <textElement/> <text><![CDATA["GreekText and CyrillicText"]]></text> </staticText> <textField> <reportElement x = "0" y = "190" width = "200" height = "60"/> <textElement> <font fontName = "DejaVu Sans" size = "14" isItalic = "true" isUnderline = "true"/> </textElement> <textFieldExpression class = "java.lang.String"> <![CDATA[$P{GreekText} + "\n" + $P{CyrillicText}]]> </textFieldExpression> </textField> <staticText> <reportElement x = "210" y = "190" width = "340" height = "60"/> <textElement/> <text><![CDATA["GreekText and CyrillicText"]]></text> </staticText> <textField> <reportElement x = "0" y = "260" width = "200" height = "60"/> <textElement> <font fontName = "DejaVu Sans" size = "14" isBold = "true" isItalic = "true" isUnderline = "true"/> </textElement> <textFieldExpression class = "java.lang.String"> <![CDATA[$P{GreekText} + "\n" + $P{CyrillicText}]]> </textFieldExpression> </textField> <staticText> <reportElement x = "210" y = "260" width = "340" height = "60"/> <textElement/> <text><![CDATA["GreekText and CyrillicText"]]></text> </staticText> <textField> <reportElement x = "0" y = "330" width = "200" height = "60"/> <textElement textAlignment = "Right"> <font fontName="DejaVu Sans" size = "22"/> </textElement> <textFieldExpression class = "java.lang.String"> <![CDATA[$P{ArabicText}]]>
            </textFieldExpression>
				
         </textField>
         
         <textField>
            <reportElement x = "210" y = "330" width = "340" height = "60"/>
            
            <textElement textAlignment = "Right">
               <font fontName = "DejaVu Sans" size = "22"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{HebrewText}]]>
            </textFieldExpression>
				
         </textField>
      
      </band>
   </title>
	
</jasperReport>

W powyższym pliku widzimy obecność kodowania UTF-8. Również zlokalizowane fragmenty tekstu Unicode są przechowywane w parametrach dokumentu.

Kod java do wypełnienia i wygenerowania raportu jest jak poniżej. Zapiszmy ten plikJasperUnicodeReportFill.java do katalogu C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint.

package com.tutorialspoint;

import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;

public class JasperUnicodeReportFill {
   public static void main(String[] args) {
      String sourceFileName ="C://tools/jasperreports-5.0.1/test/" + 
         "jasper_report_template.jasper";

      try {
         JasperFillManager.fillReportToFile(sourceFileName, null, 
            new JREmptyDataSource());
      } catch (JRException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }

   }
}

Tutaj używamy instancji JREmptyDataSource podczas wypełniania raportów, aby symulować źródło danych z jednym rekordem, ale wszystkie pola w tym pojedynczym rekordzie są puste .

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 następująca.

Plik importu - baseBuild.xml jest pobierany z rozdziału Konfiguracja środowiska i powinien być umieszczony w tym samym katalogu co 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.JasperUnicodeReportFill (viewFullReport jest domyślnym celem) w następujący sposób -

C:\tools\jasperreports-5.0.1\test>ant  -Dmain-class=com.tutorialspoint.JasperUnicodeReportFill
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 t
   [javac] Compiling 1 source file 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.JasperUnicodeReportFill
   [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.

BUILD SUCCESSFUL
Total time: 4 minutes 1 second

W wyniku powyższej kompilacji otworzy się okno JasperViewer, jak pokazano na poniższym ekranie -

Tutaj widzimy, że wyświetlany tekst jest w różnych językach. Widzimy również, że języki są zgrupowane razem na tej samej stronie, a także zmieszane w tym samym elemencie tekstowym.

JasperReports ma funkcję <style>, która pomaga kontrolować właściwości tekstu w szablonie raportu. Ten element to zbiór ustawień stylu 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ż w całym raporcie odwołuje się do odpowiedniego stylu raportu.

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 -

  • logiczne wyrażenie warunkowe
  • 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 przez definicję 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 należy go umieścić w tym samym katalogu co 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).

W poprzednich rozdziałach widzieliśmy, że dane wyświetlane w raporcie są zwykle pobierane z parametrów raportu i pól raportu. Dane te mogą być przetwarzane przy użyciu zmiennych raportu i ich wyrażeń. Istnieją sytuacje, w których złożonej funkcjonalności nie można łatwo osiągnąć za pomocą wyrażeń raportu lub zmiennych. Przykładami mogą być złożone operacje na ciągach znaków, tworzenie map lub list obiektów w pamięci lub manipulowanie datami przy użyciu zewnętrznych interfejsów Java. W takich sytuacjach JasperReports zapewnia nam prosty i skuteczny sposób na zrobienie tegoScriptlets.

Skryptlety to sekwencje kodu Java, które są wykonywane za każdym razem, gdy wystąpi zdarzenie raportu. Na wartości zmiennych raportu można wpływać za pomocą skryptletów.

Deklaracja Scriptlet

Możemy zadeklarować skryptlet na dwa sposoby -

  • Korzystanie z <scriptlet> element. Ten element ma atrybut nazwy i atrybut klasy . Klasa atrybut powinien podać nazwę klasy, która rozciąga JRAbstractScriptlet klasę. Klasa musi być dostępna w ścieżce klas w czasie wypełniania raportu i musi mieć pusty konstruktor, aby silnik mógł tworzyć jej instancję w locie.

  • Korzystanie z atrybutu scriptletClass elementu <jasperReport> w szablonie raportu (JRXML). Ustawiając ten atrybut na w pełni kwalifikowaną nazwę scriptletu (łącznie z całą nazwą pakietu), wskazujemy, że chcemy użyć scriptletu. Instancja skryptletu utworzona za pomocą tego atrybutu działa jak pierwszy skryptlet na liście skryptletów i ma wstępnie zdefiniowaną nazwę REPORT.

Klasa Scriptlet

Skryptlet to klasa Java, która musi rozszerzać jedną z następujących klas -

  • net.sf.jasperreports.engine.JRAbstractScriptlet- Ta klasa zawiera kilka abstrakcyjnych metod, które muszą zostać przesłonięte w każdej implementacji. Te metody są wywoływane automatycznie przez JasperReports w odpowiednim momencie. Programista musi zaimplementować wszystkie metody abstrakcyjne.

  • net.sf.jasperreports.engine.JRDefaultScriptlet- Ta klasa zawiera domyślne puste implementacje każdej metody w JRAbstractScriptlet. Deweloper jest zobowiązany do wdrożenia tylko tych metod, których potrzebuje dla swojego projektu.

Poniższa tabela zawiera listę metod w powyższej klasie. Metody te zostaną wywołane przez silnik raportujący w odpowiednim momencie, podczas fazy wypełniania raportu.

S.NO Metoda i opis
1

public void beforeReportInit()

Wywoływane przed inicjalizacją raportu.

2

public void afterReportInit()

Wywoływane po inicjalizacji raportu.

3

public void beforePageInit()

Wywoływane przed zainicjowaniem każdej strony.

4

public void afterPageInit()

Wywoływane po zainicjowaniu każdej strony.

5

public void beforeColumnInit()

Wywoływane przed zainicjowaniem każdej kolumny.

6

public void afterColumnInit()

Wywoływane po zainicjowaniu każdej kolumny.

7

public void beforeGroupInit(String groupName)

Wywoływana przed zainicjowaniem grupy określonej w parametrze.

8

public void afterGroupInit(String groupName)

Wywoływane po zainicjowaniu grupy określonej w parametrze.

9

public void beforeDetailEval()

Wywoływane przed oceną każdego rekordu w sekcji szczegółowej raportu.

10

public void afterDetailEval()

Wywoływane po ocenie każdego rekordu w szczegółowej sekcji raportu.

W raporcie można określić dowolną liczbę skryptletów. Jeśli dla raportu nie określono skryptu, mechanizm nadal tworzy pojedynczą instancję JRDefaultScriptlet i rejestruje ją przy użyciu wbudowanego parametru REPORT_SCRIPTLET.

Do naszych skryptletów możemy dodać dodatkowe metody, których potrzebujemy. Raporty mogą wywoływać te metody przy użyciu wbudowanego parametru REPORT_SCRIPTLET.

Global Scriptlets

Możemy kojarzyć skryptlety w inny sposób z raportami, czyli przez globalne deklarowanie skryptletów. To sprawia, że ​​skryptlety mają zastosowanie do wszystkich raportów wypełnianych w danym wdrożeniu JasperReports. Ułatwia to fakt, że do JasperReports można dodawać skrypty jako rozszerzenia. Punkt rozszerzenia skryptletu jest reprezentowany przez interfejs net.sf.jasperreports.engine.scriptlets.ScriptletFactory . JasperReports załaduje wszystkie fabryki skryptów dostępne przez rozszerzenia w czasie wykonywania. Następnie zapyta każdego z nich o listę instancji skryptów, które chcą zastosować do bieżącego raportu, który jest uruchamiany. Pytając o listę instancji skryptów, silnik podaje pewne informacje kontekstowe, z których fabryka może skorzystać w celu podjęcia decyzji, które skrypty faktycznie mają zastosowanie do bieżącego raportu.

Report Governors

Governors to tylko rozszerzenie globalnych skryptletów, które pozwalają nam rozwiązać problem wchodzenia silnika raportów w nieskończoną pętlę w czasie wykonywania, podczas generowania raportów. Nieprawidłowe szablony raportów nie mogą zostać wykryte w czasie projektowania, ponieważ przez większość czasu warunki wprowadzania nieskończonych pętli zależą od rzeczywistych danych wprowadzanych do silnika w czasie wykonywania. Report Governors pomagają w podjęciu decyzji, czy dany raport wszedł w nieskończoną pętlę i mogą go zatrzymać. Zapobiega to wyczerpaniu zasobów maszyny, na której jest uruchamiany raport.

JasperReports ma dwa proste regulatory raportów, które zatrzymywałyby wykonanie raportu na podstawie określonej maksymalnej liczby stron lub określonego limitu czasu. Oni są -

  • net.sf.jasperreports.governors.MaxPagesGovernor- To jest skryptlet globalny, który szuka dwóch właściwości konfiguracyjnych, aby zdecydować, czy ma zastosowanie do aktualnie uruchamianego raportu. Właściwości konfiguracyjne to -

    • net.sf.jasperreports.governor.max.pages.enabled=[true|false]

    • net.sf.jasperreports.governor.max.pages=[integer]

  • net.sf.jasperreports.governors.TimeoutGovernor- Jest to również globalny skryptlet, który szuka następujących dwóch właściwości konfiguracyjnych, aby zdecydować, czy ma zastosowanie, czy nie.

    Właściwości konfiguracyjne to -

    • net.sf.jasperreports.governor.timeout.enabled=[true|false]

    • net.sf.jasperreports.governor.timeout=[milliseconds]

Właściwości obu zarządców można ustawić globalnie, w pliku jasperreports.properties lub na poziomie raportu, jako niestandardowe właściwości raportu. Jest to przydatne, ponieważ różne raporty mogą mieć różny szacowany rozmiar lub limity czasu, a także dlatego, że możesz chcieć włączyć zarządców dla wszystkich raportów, wyłączając je dla niektórych lub odwrotnie.

Przykład

Napiszmy klasę scriptlet (MyScriptlet). Zawartość pliku C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint \ MyScriptlet.java jest następująca -

package com.tutorialspoint;

import net.sf.jasperreports.engine.JRDefaultScriptlet;
import net.sf.jasperreports.engine.JRScriptletException;


public class MyScriptlet extends JRDefaultScriptlet {

   public void afterReportInit() throws JRScriptletException{
      System.out.println("call afterReportInit()");
      // this.setVariableValue("AllCountries", sbuffer.toString());
      this.setVariableValue("someVar", new String("This variable value 
         was modified by the scriptlet."));
   }

   public String hello() throws JRScriptletException {
      return "Hello! I'm the report's scriptlet object.";
   }

}

Szczegóły powyższej klasy skryptletów są następujące -

  • W metodzie afterReportInit ustawiamy wartość zmiennej"someVar" this.setVariableValue ("someVar", new String ("Wartość tej zmiennej została zmodyfikowana przez skryptlet.")).

  • Na końcu klasy została wywołana dodatkowa metoda 'hello'został zdefiniowany. To jest przykład metody, którą można dodać do Scriptlet, która w rzeczywistości zwraca wartość, zamiast ustawiać zmienną.

Następnie dodamy odwołanie do klasy scriptlet w naszym istniejącym szablonie raportu (rozdział Projekty raportów ). 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"
   scriptletClass = "com.tutorialspoint.MyScriptlet">
	
   <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> <variable name = "someVar" class = "java.lang.String"> <initialValueExpression> <![CDATA["This is the initial variable value."]]> </initialValueExpression> </variable> <title> <band height = "100"> <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> <textField isBlankWhenNull = "true"> <reportElement x = "0" y = "50" width = "515" height = "30" forecolor = "#993300"/> <textElement textAlignment = "Center"> <font size = "10"/> </textElement> <textFieldExpression class = "java.lang.String"> <![CDATA[$V{someVar}]]>
            </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" /> <textElement textAlignment = "Center" verticalAlignment = "Middle" /> <textFieldExpression class = "java.lang.String"> <![CDATA[$F{name}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </detail>
   
   <summary>
      <band height = "45">
            
         <textField isStretchWithOverflow = "true">
            <reportElement x = "0" y = "10" width = "515" height = "15" />
            <textElement textAlignment = "Center"/>
               
            <textFieldExpression class = "java.lang.String">
               <![CDATA["There are " + String.valueOf($V{REPORT_COUNT}) + " records on this report."]]> </textFieldExpression> </textField> <textField isStretchWithOverflow = "true"> <reportElement positionType = "Float" x = "0" y = "30" width = "515" height = "15" forecolor = "# 993300" /> <textElement textAlignment = "Center"> <font size = "10"/> </textElement> <textFieldExpression class = "java.lang.String"> <![CDATA[$P{REPORT_SCRIPTLET}.hello()]]>
            </textFieldExpression>
            
         </textField>
         
      </band>
   </summary>
	
</jasperReport>

Szczegóły poprawionego szablonu raportu podano poniżej -

  • Odwołaliśmy się do klasy MyScriptlet w atrybucie scriptletClass elementu <jasperReport>.

  • Scriptlety mogą tylko uzyskiwać dostęp do pól i parametrów raportu, ale nie mogą ich modyfikować. Jednak skryptlety mogą modyfikować wartości zmiennych raportu. Można to osiągnąć, wywołując metodę setVariableValue (). Ta metoda jest zdefiniowana w klasie JRAbstractScriptlet, która jest zawsze klasą nadrzędną każdego scriptletu. Tutaj zdefiniowaliśmy zmienną someVar , która zostanie zmodyfikowana przez MyScriptlet tak, aby miała wartość Ta wartość została zmodyfikowana przez skryptlet .

  • Powyższy szablon raportu zawiera wywołanie metody w paśmie Podsumowanie, które ilustruje, jak pisać nowe metody (w skryptletach) i używać ich w szablonie raportu. ($P{REPORT_SCRIPTLET}.hello())

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 podano 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 podano 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 należy go umieścić w tym samym katalogu co 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 bu
   [javac] Compiling 4 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.
   [java] call afterReportInit()
   [java] call afterReportInit()

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.

BUILD SUCCESSFUL
Total time: 18 minutes 49 seconds

W wyniku powyższej kompilacji otworzy się okno JasperViewer, jak pokazano na poniższym ekranie -

Tutaj widzimy dwa komunikaty wyświetlane z klasy MyScriptlet -

  • W sekcji tytułowej - wartość tej zmiennej została zmodyfikowana przez skryptlet
  • Na dole - witam! Jestem obiektem skryptu raportu.

Podraporty są jedną z fajnych funkcji JasperReports. Ta funkcja umożliwia włączenie raportu do innego raportu, to znaczy, że jeden raport może być podraportem innego. Podraporty pomagają nam upraszczać projekty raportów, ponieważ możemy tworzyć wiele prostych raportów i umieszczać je w raporcie głównym. Podraporty są kompilowane i wypełniane tak jak zwykłe raporty. Każdy szablon raportu może zostać użyty jako podraport po włączeniu do innego szablonu raportu, bez żadnych zmian w środku (w szablonie raportu).

Podraporty są jak zwykłe szablony raportów. W rzeczywistości są to obiekty net.sf.jasperreports.engine.JasperReport , które są uzyskiwane po skompilowaniu obiektu net.sf.jasperreports.engine.design.JasperDesign .

<subreport> Element

Element <subreport> jest używany podczas wprowadzania podraportów do raportów głównych. Oto lista elementów podrzędnych w elemencie <subreport> JRXML.

  • <reportElement>

  • <parametersMapExpression> - służy do przekazywania mapy zawierającej parametry raportu do podraportu. Mapa jest zwykle uzyskiwana z parametru w raporcie głównym lub przy użyciu wbudowanego parametru REPORTS_PARAMETERS_MAP w celu przekazania parametrów raportu nadrzędnego do podraportu. To wyrażenie powinno zawsze zwracać obiekt java.util.Map, w którym klucze są nazwami parametrów.

  • <subreportParameter> - ten element służy do przekazywania parametrów do podraportu. Ma nazwę atrybutu , która jest obowiązkowa.

  • <connectionExpression> - służy do przekazywania połączenia java.sql.Connection do podraportu. Jest używany tylko wtedy, gdy szablon podraportu wymaga połączenia z bazą danych podczas fazy wypełniania raportu.

  • <dataSourceExpression> - służy do przekazywania źródła danych do podraportu. To źródło danych jest zwykle uzyskiwane z parametru w raporcie głównym lub przy użyciu wbudowanego parametru REPORT_DATA_SOURCE w celu przekazania źródła danych raportu nadrzędnego do podraportu.

  • Elementy ( connectionExpression i dataSourceExpression ) nie mogą znajdować się w tym samym czasie w deklaracji elementu <subreport>. Dzieje się tak, ponieważ nie możemy dostarczyć zarówno źródła danych, jak i połączenia z podraportem. Musimy zdecydować się na jedną z nich i się jej trzymać.

  • <returnValue> - służy do przypisywania wartości jednej ze zmiennych podraportu do jednej ze zmiennych raportu głównego. Ten element podrzędny ma następujące atrybuty -

    • subreportVariable - ten atrybut określa nazwę zmiennej podraportu, której wartość ma zostać zwrócona.

    • toVariable - ten atrybut określa nazwę nadrzędnej zmiennej raportu, której wartość ma zostać skopiowana / zwiększona o wartość z podraportu.

    • obliczenia - ten atrybut może przyjmować wartości: Nothing, Count, DistinctCount, Sum, Average, Lowest, Highest, StandardDeviation, Variance. Wartość domyślna do obliczania atrybutów to „Nic”.

    • IncrementerFactoryClass - ten atrybut określa klasę fabryki do tworzenia instancji jednostki zwiększającej.

  • <subreportExpression> - wskazuje, gdzie znaleźć skompilowany szablon raportu dla podraportu. Ten element ma rozszerzenieclassatrybut. Klasa atrybut może mieć żadnej z tych wartości: java.lang.String, java.io.File, java.net.URL, java.io.InputStream, net.sf.jasperreports.engine.JasperReport. Wartość domyślna to java.lang.String .

  • isUsingCache - jest to atrybut elementu <subreport>. Jest to wartość logiczna, po ustawieniu wartości true silnik raportowania będzie próbował rozpoznać wcześniej załadowane obiekty szablonu podraportu, korzystając z określonego źródła. Ta funkcja buforowania jest dostępna tylko dla elementów podraportu, które mają wyrażenia zwracające obiekty java.lang.String jako źródło szablonu podraportu, reprezentujące nazwy plików, adresy URL lub zasoby ścieżki klas.

Przykład

Weźmy prosty przykład, aby zademonstrować tworzenie podraportów przy użyciu JRDataSource. Najpierw napiszmy dwa nowe szablony raportów, jeden jest podraportem, a drugi raportem głównym. Zawartość szablonu podraportu (address_report_template.jrxml) jest taka, jak podano poniżej. Zapisz go w katalogu C: \ tools \ jasperreports-5.0.1 \ test.

<?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 = "address_report_template" pageWidth = "175" pageHeight = "842" 
   columnWidth = "175" leftMargin = "0" rightMargin = "0" 
   topMargin = "0" bottomMargin = "0">

   <field name = "city" class = "java.lang.String"/>
   <field name = "street" class = "java.lang.String"/>
   
   <background>
      <band splitType = "Stretch"/>
   </background>
   
   <title>
      <band height = "20" splitType = "Stretch">
         
         <staticText>
            <reportElement x = "0" y = "0" width = "100" height = "20"/>
            
            <textElement>
               <font size = "14" isBold = "true"/>
            </textElement>
				
            <text><![CDATA[Addresses]]></text>
         </staticText>
      
      </band>
   </title>
   
   <pageHeader>
      <band height = "12" splitType = "Stretch"/>
   </pageHeader>
   
   <columnHeader>
      <band height = "12" splitType = "Stretch"/>
   </columnHeader>
   
   <detail>
      <band height = "27" splitType = "Stretch">
         
         <textField>
            <reportElement x = "0" y = "0" width = "120" height = "20"/>
            
            <textElement>
               <font size = "12" isBold = "true"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{city}+" Address:"]]> </textFieldExpression> </textField> <textField isStretchWithOverflow = "true"> <reportElement x = "120" y = "0" width = "435" height = "20"/> <textElement> <font size = "12"/> </textElement> <textFieldExpression class = "java.lang.String"> <![CDATA[$F{street}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </detail>
   
   <columnFooter>
      <band height = "8" splitType = "Stretch"/>
   </columnFooter>
  
   <pageFooter>
      <band height = "11" splitType = "Stretch"/>
   </pageFooter>
   
   <summary>
      <band height = "9" splitType = "Stretch"/>
   </summary>

</jasperReport>

Ponieważ korzystamy ze źródła danych, musimy napisać odpowiedni plik POJO SubReportBean.java jak pokazano niżej. Zapisz go w katalogu C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint -

package com.tutorialspoint;

public class SubReportBean {
   private String city;
   private String street;

   public String getCity() {
      return city;
   }

   public void setCity(String city) {
      this.city = city;
   }

   public String getStreet() {
      return street;
   }

   public void setStreet(String street) {
      this.street = street;
   }
}

Tutaj zadeklarowaliśmy dwa pola „miasto” i „ulica” oraz zdefiniowano odpowiednie metody pobierające i ustawiające.

Teraz zaktualizujmy nasze istniejące DataBeanplik. Dodamy nowe pole subReportBeanList , które będzie java.util.List. To pole będzie zawierało listę obiektów SubReportBean. Zawartość pliku DataBean jest następująca. Zapisz go w katalogu C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint.

package com.tutorialspoint;

import java.util.List;

public class DataBean {
   private String name;
   private String country;
   private List<SubReportBean> subReportBeanList;

   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;
   }

   public List<SubReportBean> getSubReportBeanList() {
      return subReportBeanList;
   }

   public void setSubReportBeanList(List<SubReportBean> subReportBeanList) {
      this.subReportBeanList = subReportBeanList;
   }
}

Zaktualizujmy teraz plik C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint \DataBeanList.java. Zawartość tego pliku jest następująca:

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class DataBeanList {
   public ArrayList<DataBean> getDataBeanList() {

      // Create sub report data
      SubReportBean subBean1 = new SubReportBean();
      subBean1.setCity("Mumbai");
      subBean1.setStreet("M.G.Road");
      SubReportBean subBean2 = new SubReportBean();
      subBean2.setCity("New York");
      subBean2.setStreet("Park Street");
      SubReportBean subBean3 = new SubReportBean();
      subBean3.setCity("San Fransisco");
      subBean3.setStreet("King Street");

      ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();

      // Create master report data
      dataBeanList.add(produce("Manisha", "India",
         Arrays.asList(subBean1)));
      dataBeanList.add(produce("Dennis Ritchie", "USA",
         Arrays.asList(subBean2)));
      dataBeanList.add(produce("V.Anand", "India",
         Arrays.asList(subBean1)));
      dataBeanList.add(produce("Shrinath", "California",
         Arrays.asList(subBean3)));

      return dataBeanList;
   }

   /*
    * This method returns a DataBean object,
    * with name, country and sub report
    * bean data set in it.
    */
   private DataBean produce(String name, String country,
      List<SubReportBean> subBean) {
      DataBean dataBean = new DataBean();

      dataBean.setName(name);
      dataBean.setCountry(country);
      dataBean.setSubReportBeanList(subBean);

      return dataBean;
   }
}

W metodzie create () w powyższym pliku ustawiamy listę SubReportBean.

Teraz napiszmy nowy szablon raportu głównego (jasper_report_template.jrxml). Zapisz ten plik w kataloguC:\tools\jasperreports-5.0.1\test. Zawartość tego pliku jest następująca -

<?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 = "jasper_report_template" language = "groovy" pageWidth = "595"
   pageHeight = "842" columnWidth ="555" leftMargin = "20" rightMargin = "20"
   topMargin = "20" bottomMargin = "20">

   <parameter name = "SUBREPORT_DIR" class = "java.lang.String" isForPrompting = "false">
      <defaultValueExpression>
         <![CDATA["C:\\tools\\jasperreports-5.0.1\\test\\"]]>
      </defaultValueExpression>
   </parameter>
   
   <field name = "country" class = "java.lang.String"/>
   <field name = "name" class = "java.lang.String"/>
   <field name = "subReportBeanList" class = "java.util.List"/>
   
   <background>
      <band splitType = "Stretch"/>
   </background>
   
   <title>
      <band height = "35" splitType = "Stretch">
         
         <staticText>
            <reportElement x = "0" y = "0" width = "204" height = "34"/>
            
            <textElement>
               <font size = "26" isBold = "true"/>
            </textElement>
				
            <text><![CDATA[Contact Report]]></text>
         </staticText>
      
      </band>
   </title>
   
   <pageHeader>
      <band height = "17" splitType = "Stretch"/>
   </pageHeader>
   
   <columnHeader>
      <band height = "21" splitType = "Stretch"/>
   </columnHeader>
   
   <detail>
      <band height = "112" splitType = "Stretch">
            
         <staticText>
            <reportElement x = "0" y = "0" width = "100" height = "20"/>
            
            <textElement>
               <font size = "12" isBold = "true"/>
            </textElement>
				
            <text><![CDATA[Name:]]></text>
         </staticText>
         
         <staticText>
            <reportElement x = "0" y = "20" width = "100" height = "20"/>
            
            <textElement>
               <font size = "12" isBold = "true"/>
            </textElement>
				
            <text><![CDATA[Country:]]></text>
         </staticText>
         
         <textField>
            <reportElement x = "104" y = "0" width = "277" height = "20"/>
            
            <textElement>
               <font size = "12"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{name}]]> </textFieldExpression> </textField> <textField> <reportElement x = "104" y = "20" width = "277" height = "20"/> <textElement> <font size = "12"/> </textElement> <textFieldExpression class = "java.lang.String"> <![CDATA[$F{country}]]>
            </textFieldExpression>
         </textField>
         
         <subreport>
            <reportElement positionType = "Float" x = "335" y = "25" width = "175"
               height = "20" isRemoveLineWhenBlank = "true" backcolor = "#99ccff"/>

            <dataSourceExpression>
               new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource
                  ($F{subReportBeanList}) </dataSourceExpression> <subreportExpression class = "java.lang.String"> <![CDATA[$P{SUBREPORT_DIR} + "address_report_template.jasper"]]>
            </subreportExpression>
         </subreport>
         
         <line>
            <reportElement x = "0" y = "50" width = "550" height = "1"/>
         </line>
      
      </band>
   </detail>
   
   <columnFooter>
      <band height = "19" splitType = "Stretch"/>
   </columnFooter>
   
   <pageFooter>
      <band height = "18" splitType = "Stretch"/>
   </pageFooter>
   
   <summary>
      <band height = "14" splitType = "Stretch"/>
   </summary>

</jasperReport>

W powyższym szablonie zdefiniowaliśmy nowy parametr „SUBREPORT_DIR”, który określa ścieżkę do podraportu. Zdefiniowaliśmy pole subReportBeanList typu java.util.List, które odpowiada właściwości w pliku DataBean. Element <subreport> ma element podrzędny <dataSourceExpression>. Umieściliśmy listę subReportBeanList w instancji JRBeanCollectionDataSource. W elemencie podrzędnym <subreportExpression /> podaliśmy nazwę podraportu (AddressReport.jasper).

Teraz napiszmy nową klasę CreateReportaby skompilować i wykonać nasz szablon raportu. Zawartość plikuC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\CreateReport.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.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class CreateReport {

   public static void main(String[] args) {
      String masterReportFileName = "C://tools/jasperreports-5.0.1/test"
         + "/jasper_report_template.jrxml";
      String subReportFileName = "C://tools/jasperreports-5.0.1/test"
         + "/AddressReport.jrxml";
      String destFileName = "C://tools/jasperreports-5.0.1/test"
         + "/jasper_report_template.JRprint";
			
      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();
      JRBeanCollectionDataSource beanColDataSource = new 
         JRBeanCollectionDataSource(dataList);

      try {
         /* Compile the master and sub report */
         JasperReport jasperMasterReport = JasperCompileManager
            .compileReport(masterReportFileName);
         JasperReport jasperSubReport = JasperCompileManager
            .compileReport(subReportFileName);

         Map<String, Object> parameters = new HashMap<String, Object>();
         parameters.put("subreportParameter", jasperSubReport);
         JasperFillManager.fillReportToFile(jasperMasterReport, 
            destFileName, parameters, beanColDataSource);

      } catch (JRException e) {

         e.printStackTrace();
      }
      System.out.println("Done filling!!! ...");
   }
}

Tutaj widzimy, że kompilujemy zarówno szablon raportu głównego, jak i podrzędnego i przekazujemy plik raportu głównego (.jasper) do wypełnienia raportu.

Generowanie raportów

Teraz wszystkie nasze pliki są gotowe, skompilujmy je i uruchommy 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 należy go umieścić w tym samym katalogu co 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.CreateReport (viewFullReport jest domyślnym celem) w następujący sposób -

Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml

clean-sample:
   [delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes

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
   [javac] Compiling 7 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.CreateReport
   [java] Compiling Report Design ...
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
   [java] log4j:WARN Please initialize the log4j system properly.
   [java] Done filling!!! ...

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.

BUILD SUCCESSFUL
Total time: 72 minutes 13 seconds

W wyniku powyższej kompilacji otworzy się okno JasperViewer, jak pokazano na poniższym ekranie -

Tutaj widzimy, że wyświetlane są atrybuty Nazwa, Kraj i Adres.

Wcześniej ludzie musieli polegać na skryptletach do zbierania danych wykresu i renderowania wykresu przy użyciu elementu obrazu w szablonie raportu. JasperReports sprawia, że ​​jest to teraz proste, ponieważ ma wbudowaną obsługę wykresów przy użyciu nowego komponentu wykresu.

Korzystając z nowego składnika wykresu, użytkownik musi zastosować tylko ustawienia wizualne i zdefiniować wyrażenia, które pomogą zbudować zestaw danych wykresu. JasperReports używa JFreeChart jako podstawowej biblioteki wykresów. Podczas konfigurowania nowego komponentu wykresu zaangażowane są następujące trzy komponenty -

  • Ogólny składnik wykresu.

  • Zestaw danych wykresu (który grupuje ustawienia związane z danymi wykresu).

  • Wykres wykresu (który grupuje ustawienia wizualne związane ze sposobem renderowania elementów wykresu).

JasperReports obsługuje obecnie następujące typy wykresów: kołowy, kołowy 3D, słupkowy, słupkowy 3D, słupkowy XY, słupkowy ułożony, słupkowy ułożony trójwymiarowo, liniowy, liniowy XY, obszarowy, obszar XY, skumulowany, punktowy, bąbelkowy, szeregów czasowych, wysoki -Low-Open-Close, Candlestick, Multiple Axis, Meter, Thermometer i Gantt.

Właściwości wykresu

Wykresy są zwykłymi elementami raportu, więc niektóre ze swoich właściwości dzielą ze wszystkimi pozostałymi elementami raportu. Istnieje element JRXML o nazwie <chart>, służy do tworzenia wszelkiego rodzaju wykresów. Ten element grupuje specjalne ustawienia specyficzne dla wykresów, które mają zastosowanie do wszystkich typów wykresów.

Podelementy wykresu

Podelementami elementu <chart> są -

  • <reportElement> - Są to obiekty wyświetlane, takie jak statyczne teksty, pola tekstowe, obrazy, linie i prostokąty, które umieszczasz w sekcjach szablonu raportu.

  • <Box> - Ten element jest używany do otaczania wykresów obramowaniem, które można dostosowywać z każdej strony.

  • <chartTitle>- Ten element służy do umieszczania tytułu wykresu. Pozycja atrybut decyduje położenie tytuł wykresu w raporcie. Ten element ma atrybuty -Position(Wartości mogą być Top , Bottom , Left , Right . Głucha wartość to Top ),color. <chartTitle> ma czcionkę i titleExpression jako podelementy.

  • <chartSubtitle>- Ten element służy do umieszczania podtytułu wykresu. Ten element ma atrybut -color. <chartSubtitle> ma podelementy font i subtitleExpression .

  • <chartLegend>- Element może kontrolować właściwości związane z czcionką, a także kolor tekstu i kolor tła legendy wykresu za pomocą tego elementu. Ten element ma atrybuty -textColor i backgroundColor.

  • <anchorNameExpression> - Ten element tworzy cel dla kotwicy.

  • <hyperlinkReferenceExpression> - Ten element zawiera wyrażenie raportu wskazujące nazwę zasobu zewnętrznego (zwykle adres URL).

  • <hyperlinkAnchorExpression> - Hiperłącze wskazuje zakotwiczenie w zasobie zewnętrznym.

  • <hyperlinkPageExpression> - Hiperłącze kieruje do strony w bieżącym raporcie.

  • <hyperlinkTooltipExpression>- Ten element kontroluje etykietkę narzędzia hiperłącza. Typ wyrażenia powinien być java.lang.String .

  • <hyperlinkParameter> - Ten element, jeśli jest obecny, generuje ostateczne hiperłącze w zależności od wartości parametrów.

Atrybuty wykresu

Atrybuty w elemencie <chart> dostępne dla wszystkich typów wykresów to -

  • isShowLegend- Ten atrybut służy do określenia, czy legenda wykresu zostanie wyświetlona w raporcie. Wartości mogą być prawdziwe lub fałszywe . Wartość domyślna to prawda .

  • evaluationTime- Określa, kiedy zostanie obliczone wyrażenie wykresu. Wartości mogą być teraz , raport , strona , kolumna , grupa , pasmo . Wartość domyślna to teraz .

  • evaluationGroup- Ten atrybut określa nazwę grupy, która ma zostać użyta do oceny wyrażeń wykresu. Wartość tego atrybutu musi odpowiadać nazwie grupy, której chcielibyśmy użyć jako grupy ocen wykresu.

  • hyperlinkType- Ten atrybut może zawierać dowolną wartość tekstową. Wartość domyślna to Brak . Oznacza to, że ani pola tekstowe, ani obrazy nie przedstawiają hiperłączy, nawet jeśli występują specjalne wyrażenia hiperłącza.

  • hyperlinkTarget- Ten atrybut pomaga dostosować zachowanie określonego łącza po kliknięciu go w przeglądarce. Wartości mogą być Self lub Blank . Wartość domyślna to Self .

  • bookmarkLevel- Ten atrybut, gdy jest ustawiony na dodatnią liczbę całkowitą, generuje zakładki w raportach eksportowanych do formatu PDF. Wartość domyślna to 0 .

  • customizerClass- To jest nazwa klasy (opcjonalnie), której można użyć do dostosowania wykresu. Wartość tego elementu musi być ciągiem zawierającym nazwę klasy dostosowania.

Dostosowywanie wykresów

Jak wspomniano powyżej, JasperReports używa JFreeChart jako podstawowej biblioteki wykresów. JFreeChart zawiera funkcje, które nie są bezpośrednio obsługiwane przez JasperReports. Możemy skorzystać z tych funkcji, dostarczając klasę dostosowywania za pośrednictwem atrybutu customizerClass w elemencie <chart>. Klasa dostosowująca to nic innego jak implementacja interfejsu net.sf.jasperreports.engine.JRChartCustomizer . Najłatwiejszym sposobem zaimplementowania tego interfejsu jest rozszerzenie klasy net.sf.jasperreports.engine.JRAbstractChartCustomizer, a tym samym uzyskanie dostępu do parametrów, pól i zmiennych w celu bardziej elastycznego dostosowywania wykresów na podstawie danych raportu.

Zestawy danych wykresów

Jedną z typowych właściwości we wszystkich typach wykresów jest <dataset> element. Zestawy danych wykresów pomagają mapować dane raportu i pobierać dane wykresu w czasie wykonywania. Każdy typ wykresu zawiera różne podelementy definiujące wyrażenia wykresu. Te wyrażenia definiują dane używane do generowania wykresu. Wszystkie te elementy podrzędne zawierają element <dataset>, który określa, kiedy wyrażenia wykresu są oceniane i resetowane.

W JasperReports dostępnych jest kilka typów zestawów danych wykresów, ponieważ każdy typ wykresu działa z określonymi zestawami danych: Kołowy, Kategoria, XY, Szeregi czasowe, Okres, XYZ i Wysoki-Niski. Każdy z tych typów zestawów danych implementuje interfejs net.sf.jasperreports.engine.JRChartDataset , który definiuje zestawy danych wykresów. Wszystkie zestawy danych wykresów są inicjowane i zwiększane w ten sam sposób; jednak różnią się one tylko rodzajem danych lub seriami danych, które mapują.

Właściwości zbioru danych

Poniższa tabela podsumowuje atrybuty elementu <dataset> -

Atrybut Opis Wartości
resetType Ten atrybut określa, kiedy wartość wyrażenia wykresu ma zostać zresetowana. Brak, Raport, Strona, Kolumna, Grupa. Wartość domyślna toReport.
resetGroup Ten atrybut określa nazwę grupy, w której wartość wyrażenia wykresu jest resetowana. Wartość tego atrybutu musi być zgodna z nazwą dowolnej grupy zadeklarowanej w szablonie raportu JRXML.
IncrementType Ten atrybut określa, kiedy należy ponownie obliczyć wartość wyrażenia wykresu. Brak, Raport, Strona, Kolumna, Grupa. Wartość domyślna to"None".
IncrementGroup Ten atrybut określa nazwę grupy, w której przeliczane jest wyrażenie wykresu. Wartość tego atrybutu musi odpowiadać nazwie grupy zadeklarowanej w szablonie raportu JRXML.

Poniższa tabela podsumowuje podelementy elementu <dataaset> -

Element podrzędny Opis
<incrementWhenExpression> Sposób zwiększania zbioru danych wykresu można dostosować, odfiltrowując niepożądane dane za pomocą tego elementu podrzędnego.
<datasetRun> Zawiera informacje wymagane do utworzenia wystąpienia podrzędnego zbioru danych raportu.

Typy zbiorów danych

Konkretne typy zbiorów danych wyjaśniono poniżej -

Zestaw danych kołowych

Zbiór danych kołowych charakteryzuje się następującymi wyrażeniami -

  • <keyExpression> - reprezentuje kategorie, które będą tworzyły wycinki na wykresie kołowym. To wyrażenie może zwrócić dowolny obiekt java.lang.Comparable.

  • <valueExpression> - tworzy wartości odpowiadające każdej kategorii / kluczowi w zbiorze danych. Wartości to zawsze obiekty java.lang.Number.

  • <labelExpression> - jeśli brakuje tego wyrażenia, wykres wyświetli domyślne etykiety dla każdego wycinka na wykresie kołowym. Użyj tego wyrażenia, które zwraca wartości java.lang.String, aby dostosować etykiety elementów na wykresie kołowym.

  • <sectionHyperlink> - ustawia hiperłącza powiązane z sekcjami kołowymi.

Zbiór danych kategorii

Zbiór danych kategorii charakteryzuje się elementem <categorySeries>, który zawiera -

  • <seriesExpression> - wskazuje nazwę serii. To wyrażenie może zwrócić dowolny obiekt java.lang.Comparable.

  • <categoryExpression> - zwraca nazwę kategorii dla każdej wartości wewnątrz serii określonej przez wyrażenie serii. Kategorie to obiekty java.lang.Comparable.

  • <valueExpression> - tworzy wartości odpowiadające każdej kategorii w zbiorze danych. Wartości to zawsze obiekty java.lang.Number.

  • <labelExpression> - jeśli brakuje tego wyrażenia, wykres wyświetli domyślne etykiety dla każdego elementu na wykresie. Użyj tego wyrażenia, które zwraca wartości java.lang.String, aby dostosować etykiety pozycji na wykresie.

  • <itemHyperlink> - ustawia hiperłącza związane z elementami wykresu.

Zestaw danych XY

Zbiór danych XY charakteryzuje się elementem <xySeries>, który zawiera -

  • <seriesExpression> - wskazuje nazwę serii. To wyrażenie może zwrócić dowolny obiekt java.lang.Comparable.

  • <xValueExpression> - zwraca wartość java.lang.Number reprezentującą wartość X z pary (x, y), która zostanie dodana do bieżącej serii danych.

  • <yValueExpression> - zwraca wartość java.lang.Number reprezentującą wartość Y z pary (x, y), która zostanie dodana do bieżącej serii danych.

  • <labelExpression> - jeśli brakuje tego wyrażenia, wykres wyświetli domyślne etykiety dla każdego elementu na wykresie. Użyj tego wyrażenia, które zwraca wartości java.lang.String, aby dostosować etykiety pozycji na wykresie.

  • <itemHyperlink> - ustawia hiperłącza powiązane z elementami wykresu.

Zbiór danych XYZ

Zbiór danych XYZ charakteryzuje się elementem <xyzSeries>, który zawiera -

  • <seriesExpression> - wskazuje nazwę serii. To wyrażenie może zwrócić dowolny obiekt java.lang.Comparable.

  • <xValueExpression> - zwraca wartość java.lang.Number reprezentującą wartość X z pozycji (x, y, z), która zostanie dodana do bieżącej serii danych.

  • <yValueExpression> - zwraca wartość java.lang.Number reprezentującą wartość Y z pozycji (x, y, z), która zostanie dodana do bieżącej serii danych.

  • <zValueExpression> - zwraca wartość java.lang.Number reprezentującą wartość Z z pozycji (x, y, z), która zostanie dodana do bieżącej serii danych.

  • <labelExpression> - jeśli brakuje tego wyrażenia, wykres wyświetli domyślne etykiety dla każdego elementu na wykresie. Użyj tego wyrażenia, które zwraca wartości java.lang.String, aby dostosować etykiety pozycji na wykresie.

  • <itemHyperlink> - ustawia hiperłącza powiązane z elementami wykresu.

Zestaw danych szeregów czasowych

Zestaw danych szeregów czasowych jest charakteryzowany przez atrybut timePeriod i element <timeSeries>. Atrybut timePeriod określa typ serii danych w zestawie danych. Szeregi czasowe mogą zawierać wartości liczbowe skojarzone z dniami, miesiącami, latami lub innymi wstępnie zdefiniowanymi okresami. Możliwe wartości to: rok, kwartał, miesiąc, tydzień, dzień - jest to wartość domyślna, godzina, minuta, sekunda, milisekunda.

Element <timeSeries> zawiera -

  • <seriesExpression> - wskazuje nazwę serii. To wyrażenie może zwrócić dowolny obiekt java.lang.Comparable.

  • <timePeriodExpression> - zwraca wartość java.util.Date, z której silnik wyodrębni odpowiedni okres czasu w zależności od wartości ustawionej dla atrybutu timePeriod wspomnianego powyżej.

  • <valueExpression> - zwraca wartość java.lang.Number do skojarzenia z odpowiednią wartością okresu czasu podczas zwiększania bieżącej serii zbioru danych.

  • <labelExpression> - jeśli brakuje tego wyrażenia, wykres wyświetli domyślne etykiety dla każdego elementu na wykresie. Użyj tego wyrażenia, które zwraca wartości java.lang.String, aby dostosować etykiety pozycji na wykresie.

  • <itemHyperlink> - ustawia hiperłącza powiązane z elementami wykresu.

Zestaw danych dla okresu

Zbiór danych z okresu jest scharakteryzowany przez element <timePeriodSeries>, który zawiera -

  • <seriesExpression> - wskazuje nazwę serii. To wyrażenie może zwrócić dowolny obiekt java.lang.Comparable.

  • <startDateExpression> - określa początek przedziału dat, z którym zostanie skojarzona wartość liczbowa, gdy zostanie dodana do szeregu okresów.

  • <endDateExpression> - określa koniec przedziału dat, z którym wartość liczbowa zostanie skojarzona, gdy zostanie dodana do szeregu okresów.

  • <valueExpression> - zwraca wartość java.lang.Number do powiązania z bieżącym interwałem dat określonym przez wyrażenia daty początkowej i końcowej.

  • <labelExpression> - jeśli brakuje tego wyrażenia, wykres wyświetli domyślne etykiety dla każdego elementu na wykresie. Użyj tego wyrażenia, które zwraca wartości java.lang.String, aby dostosować etykiety pozycji na wykresie.

  • <itemHyperlink> - ustawia hiperłącza powiązane z elementami wykresu.

High Low Dataset

Zestaw danych o wysokim i niskim poziomie charakteryzuje się następującymi wyrażeniami -

  • <seriesExpression> - obecnie tylko jedna seria jest obsługiwana na wykresie High-Low lub Candlestick. Jednak ta pojedyncza seria musi być identyfikowana przez wartość java.lang.Comparable zwracaną przez to wyrażenie, a także musi być używana jako nazwa serii w legendzie wykresu.

  • <dateExpression> - zwraca datę, do której odnosi się bieżąca pozycja (wysoka, niska, otwarta, zamknięta, wolumen).

  • <highExpression> - zwraca wartość java.lang.Number, która będzie częścią pozycji danych dodanej do serii, gdy zbiór danych zostanie zwiększony.

  • <lowExpression> - zwraca wartość java.lang.Number, która będzie częścią elementu danych dodanego do serii, gdy zbiór danych zostanie zwiększony.

  • <openExpression> - zwraca wartość java.lang.Number, która będzie częścią elementu danych dodanego do serii, gdy zbiór danych zostanie zwiększony.

  • <closeExpression> - zwraca wartość java.lang.Number, która będzie częścią pozycji danych dodanej do serii, gdy zbiór danych zostanie zwiększony.

  • <volumeExpression> - wyrażenie liczbowe, które zwraca wartość wolumenu do użycia dla bieżącego elementu danych. Służy tylko do wykresów świecowych.

  • <itemHyperlink> - ustawia hiperłącza powiązane z elementami wykresu.

Zestaw danych wartości

Jest to specjalna implementacja zestawu danych wykresów, która zawiera pojedynczą wartość i jest używana do renderowania wykresów miernika i termometru. Wartość jest zbierana przy użyciu wyrażenia <valueExpression>.

Wykresy

Innym wspólnym elementem JRXML we wszystkich typach wykresów jest <plot> element. To pozwala nam zdefiniować kilka cech wykresu, takich jak orientacja i kolor tła. Wykresy różnią się w zależności od typu wykresu.

Atrybut fabuły

Poniższa tabela podsumowuje atrybuty elementu <plot> -

Atrybut Opis Wartości
kolor tła Ten atrybut określa kolor tła wykresu. Dowolna sześciocyfrowa wartość szesnastkowa jest prawidłową wartością tego atrybutu. Wartość szesnastkowa musi być poprzedzona znakiem #.
orientacja Ten atrybut określa orientację wykresu. Poziomo, pionowo Domyślna wartość to „Pionowo”
backgroundAlpha Ten atrybut określa przezroczystość koloru tła wykresu. Prawidłowe wartości tego atrybutu obejmują dowolną liczbę dziesiętną z zakresu od 0 do 1 włącznie. Im wyższa liczba, tym mniej przezroczyste będzie tło. Wartość domyślna to „1”.
foregroundAlpha Ten atrybut określa przezroczystość kolorów pierwszego planu wykresu. Prawidłowe wartości tego atrybutu obejmują dowolną liczbę dziesiętną z zakresu od 0 do 1 włącznie. Im wyższa liczba, tym mniej przezroczyste będzie tło. Wartość domyślna to „1”.
labelRotation Ten atrybut umożliwia obracanie etykiet tekstowych na osi X w celu obracania w prawo lub w lewo. Ten atrybut ma zastosowanie tylko do wykresów, dla których oś x nie jest numeryczna lub nie wyświetla dat. Wartość domyślna to „0,0”.

Element <plot> ma podelement <seriesColor>, którego atrybuty to: seriesOrder i color . Ten element dostosowuje kolory dla serii i ich pozycję w sekwencji kolorów.

Specyficzne ustawienia wykresów

  • piePlot - Nie ma określonych ustawień

  • pie3DPlot- Zawiera atrybut depthFactor , wartość liczbową z zakresu od 0 do 1, która reprezentuje głębokość ciasta jako procent wysokości obszaru kreślenia.

  • barPlot - Można wyświetlać lub ukrywać etykiety znaczników, znaczniki lub etykiety elementów i zapewnia ustawienia dla obu osi.

  • bar3DPlot - Zapewnia te same ustawienia, co barPlot i generuje efekt 3D przy użyciu atrybutów xOffset i yOffset.

  • linePlot - Można pokazywać lub ukrywać linie łączące punkty elementów, można wyświetlać lub ukrywać kształty powiązane z punktami elementów i zapewniać ustawienia dla obu osi.

  • scatterPlot - Podobnie jak linePlot, może pokazywać lub ukrywać linie łączące punkty elementów, może pokazywać lub ukrywać kształty powiązane z punktami elementów i zapewnia ustawienia dla obu osi.

  • areaPlot - Zawiera ustawienia dla obu osi.

  • bubblePlot - Można ustawić wymiary bąbelków, ustawiając atrybut scaleType i zapewnić ustawienia dla obu osi.

  • timeSeriesPlot - Można pokazywać lub ukrywać linie łączące punkty elementów, można wyświetlać lub ukrywać kształty powiązane z punktami elementów i zapewniać ustawienia dla obu osi.

  • highLowPlot - Można pokazać lub ukryć otwarte tiki, można pokazać lub ukryć zamknięte tiki i zapewnia ustawienia dla obu osi.

  • candlestickPlot - Można pokazać lub ukryć głośność i zapewnić ustawienia dla obu osi.

  • meterPlot - Zawiera określone ustawienia kształtu tarczy, kąta skali, jednostek miary, interwału taktu, koloru tarczy, koloru igły, koloru zaznaczenia, czcionki wyświetlania wartości, wzoru koloru i formatu, zakresu danych i interwałów licznika.

  • thermometerPlot - Zawiera określone ustawienia lokalizacji wartości, koloru rtęci, pokazania / ukrycia linii wartości, czcionki wyświetlanej wartości, koloru i wzoru formatu, zakresu danych, zakresu niskiego, średniego i wysokiego.

  • multiAxisChart - Zawiera określone ustawienia osi uwzględnionej w wykresie.

Rodzaje wykresów

JasperReports oferuje wbudowaną obsługę kilku typów wykresów. Są one wymienione poniżej -

  • pieChart - połączenie zbioru danych Pie i wykresu Pie.

  • pie3DChart - Grupuje zestaw danych Pie i wykres Pie 3D.

  • barChart - Podstawowa kombinacja zestawu danych kategorii i wykresu słupkowego.

  • bar3DChart - Zawija zestaw danych kategorii i wykres słupkowy 3D.

  • xyBarChart - Obsługuje zestawy danych z okresów czasu, zestawy danych szeregów czasowych i zestawy danych XY oraz wykorzystuje wykres słupkowy do renderowania osi i elementów.

  • stackedBarChart - Wykorzystuje dane ze zbioru danych kategorii i renderuje jego zawartość za pomocą wykresu słupkowego.

  • stackedBar3DChart - Wykorzystuje dane ze zbioru danych kategorii i renderuje jego zawartość za pomocą wykresu Bar 3D.

  • lineChart - Grupuje zestaw danych kategorii i wykres liniowy.

  • xyLineChart - Grupuje zestaw danych XY i wykres liniowy.

  • areaChart - Elementy ze zbioru danych kategorii są renderowane przy użyciu wykresu powierzchni.

  • stackedAreaChart - Elementy ze zbioru danych kategorii są renderowane przy użyciu wykresu powierzchni.

  • xyAreaChart - Wykorzystuje dane ze zbioru danych XY i renderuje je poprzez wykres powierzchni.

  • scatterChart - Zawija zbiór danych XY wykresem punktowym.

  • bubbleChart - Łączy zestaw danych XYZ z wykresem bąbelkowym.

  • timeSeriesChart - Grupuje zestaw danych szeregów czasowych i wykres szeregów czasowych.

  • highLowChart - Połączenie zestawu danych High-Low i wykresu High-Low.

  • candlestickChart - Wykorzystuje dane z zestawu danych High-Low, ale ze specjalnym wykresem świecowym.

  • meterChart - Wyświetla pojedynczą wartość z zestawu danych wartości na tarczy, używając opcji renderowania z wykresu miernika.

  • thermometerChart - Wyświetla pojedynczą wartość w zestawie danych wartości przy użyciu opcji renderowania z wykresu termometru.

  • multiAxisChart - Zawiera wiele osi zakresu, z których wszystkie mają wspólną oś domeny.

Przykład

Aby zademonstrować wykresy, napiszmy nowy szablon raportu (jasper_report_template.jrxml). Tutaj dodamy <barChart> do sekcji <pageHeader> i <pieChart> do sekcji <summary>. Na wykresach pokazywalibyśmy oceny uzyskane z każdego przedmiotu. Zapisz go w kataloguC:\tools\jasperreports-5.0.1\test. Zawartość pliku jest taka, jak podano poniżej -

<?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 = "jasper_report_template" pageWidth = "595" pageHeight = "860"
   columnWidth = "515" leftMargin = "40" rightMargin = "40"
   topMargin = "50" bottomMargin = "50">

   <field name = "subjectName" class = "java.lang.String"/>
   <field name = "marks" class = "java.lang.Integer"/>
   
   <variable name = "countNumber" class = "java.lang.Integer" calculation = "Count">
      <variableExpression>
         <![CDATA[Boolean.TRUE]]>
      </variableExpression>
   </variable>
   
   <background>
      <band splitType = "Stretch"/>
   </background>
   
   <title>
      <band height = "79" splitType = "Stretch"/>
   </title>
   
   <pageHeader>
      <band height = "200">
    
         <barChart>
            <chart evaluationTime = "Report">
               <reportElement x = "0" y = "0" width = "555" height = "200"/>
            
               <chartTitle>
                  <titleExpression>
                     <![CDATA["My First JR Bar Chart"]]>
                  </titleExpression>
               </chartTitle>
            </chart>
      
            <categoryDataset>
               <dataset incrementType = "None"/>
            
               <categorySeries>
                  <seriesExpression>
                     <![CDATA[$F{subjectName}]]>
                  </seriesExpression>
            
                  <categoryExpression>
                     <![CDATA[$F{subjectName}]]> </categoryExpression> <valueExpression> <![CDATA[$F{marks}]]>
                  </valueExpression>

               </categorySeries>
            </categoryDataset>
      
            <barPlot isShowTickMarks = "false">
               <plot/>
            </barPlot>
         </barChart>
      
      </band>
   </pageHeader>
   
   <columnHeader>
      <band height = "20" splitType = "Stretch"/>
   </columnHeader>
   
   <detail>
      <band height = "20" splitType = "Stretch"/>
   </detail>
   
   <columnFooter>
      <band height = "20" splitType = "Stretch"/>
   </columnFooter>
   
   <pageFooter>
      <band height = "20" splitType = "Stretch"/>
   </pageFooter>
   
   <summary>
      <band height = "400" splitType = "Stretch">
      
         <pieChart>
            <chart evaluationTime = "Report">
               <reportElement x = "135" y = "0" width = "270" height = "300"/>
            
               <chartTitle>
                  <titleExpression>
                     <![CDATA["My First JR Pie Chart"]]>
                  </titleExpression>
               </chartTitle>
            </chart>
         
            <pieDataset>
               <dataset incrementType = "None"/>
               
               <keyExpression>
                  <![CDATA[$F{subjectName}]]> </keyExpression> <valueExpression> <![CDATA[$F{marks}]]>
               </valueExpression>
            </pieDataset>
            
            <piePlot>
               <plot/>
               <itemLabel/>
            </piePlot>
         </pieChart>
      
      </band>
   </summary>
	
</jasperReport>

Szczegóły powyższego pliku podano poniżej -

  • Element JRXML używany do tworzenia wykresu słupkowego znajduje się </barChart> w <pageHeader>. Zawiera element podrzędny </chart>, który zawiera element podrzędny <reportElement> definiujący wymiary i położenie wykresu.

  • Element <dataset> na wykresie słupkowym musi być ujęty między elementami <categoryDataset> i </categoryDataset> JRXML.

  • <categoryDataset> musi zawierać element <categorySeries>. Ten element definiuje, jaki element danych będą reprezentować słupki (w tym przykładzie nazwy podmiotów).

  • <categoryDataset> musi również zawierać element, który określa, w jaki sposób dane zostaną podzielone na kategorie w celu porównania. Tutaj dane są oddzielone nazwami podmiotów.

  • Element <valueExpression> definiuje, jakie wyrażenie jest używane do określenia wartości każdego słupka na wykresie. Tutaj używamy „znaków”.

  • W przypadku wykresu kołowego użyliśmy elementu <pieChart> w sekcji <summary>. Zawiera element podrzędny </chart>.

  • Element podrzędny zawiera wyrażenie raportu wskazujące, czego użyć jako klucza na wykresie. Tutaj użyliśmy subjectName.

  • Element podrzędny zawiera wyrażenie używane do obliczenia wartości klucza. Tutaj użyliśmy znaków.

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();

      try {
         JasperFillManager.fillReportToFile( sourceFileName,
            parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

Ponieważ będziemy wyświetlać oceny uzyskane za każdy przedmiot, należy zmienić POJO. PlikC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java zawartość jest taka, jak podano poniżej -

package com.tutorialspoint;

public class DataBean {
   private String subjectName;
   private Integer marks;

   public String getSubjectName() {
      return subjectName;
   }

   public void setSubjectName(String subjectName) {
      this.subjectName = subjectName;
   }

   public Integer getMarks() {
      return marks;
   }

   public void setMarks(Integer marks) {
      this.marks = marks;
   }

}

Nawet zawartość pliku C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java należy zaktualizować, jak podano 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("English", 58));
      dataBeanList.add(produce("SocialStudies", 68));
      dataBeanList.add(produce("Maths", 38));
      dataBeanList.add(produce("Hindi", 88));
      dataBeanList.add(produce("Scince", 78));
      
      return dataBeanList;
   }

   /*
    * This method returns a DataBean object, with subjectName ,
    * and marks set in it.
    */
   private DataBean produce(String subjectName, Integer marks) {
      DataBean dataBean = new DataBean();

      dataBean.setSubjectName(subjectName);
      dataBean.setMarks(marks);

      return dataBean;
   }
}

Generowanie raportów

Następnie skompilujmy i uruchommy powyższe pliki przy użyciu naszego zwykłego procesu kompilacji 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 należy go umieścić w tym samym katalogu co 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 (viewFullReport jest domyślnym celem) w następujący sposób -

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 bu
   [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.

BUILD SUCCESSFUL
Total time: 19 minutes 45 seconds

W wyniku powyższej kompilacji otworzy się okno JasperViewer, jak na poniższym ekranie -

Tutaj widzimy, że wykres słupkowy jest tworzony w nagłówku strony, a wykres kołowy jest tworzony w sekcjach podsumowania.

Raporty tabeli krzyżowej (cross-tabulation) to raporty zawierające tabele, które porządkują dane w wierszach i kolumnach w formie tabelarycznej. Obiekt tabeli przestawnej służy do wstawiania raportu tabeli przestawnej w raporcie głównym. Tabel krzyżowych można używać z dowolnym poziomem danych (nominalnym, porządkowym, przedziałowym lub współczynnikiem) i zwykle wyświetlać podsumowane dane zawarte w zmiennych raportu w postaci tabeli dynamicznej. Zmienne służą do wyświetlania danych zagregowanych, takich jak sumy, liczebności, wartości średnie.

Właściwości tabeli krzyżowej

Element JRXML <crosstab> służy do wstawiania tabeli przestawnej do raportu.

Atrybut

Poniżej znajduje się lista atrybutów <crosstab> element -

  • isRepeatColumnHeaders- Wskazuje, czy nagłówki kolumn powinny zostać ponownie wydrukowane po podziale strony. Wartość domyślna to true .

  • isRepeatRowHeaders- Wskazuje, czy nagłówki wierszy powinny zostać ponownie wydrukowane po przerwaniu kolumny tabeli przestawnej. Wartość domyślna to true .

  • columnBreakOffset- Gdy nastąpi przerwanie kolumny, wskazuje wielkość odstępu w pionie, mierzoną w pikselach, przed umieszczeniem kolejnego elementu tabeli przestawnej pod poprzednim na tej samej stronie. Wartość domyślna to 10.

  • runDirection- Wskazuje, czy dane tabeli przestawnej powinny być wypełniane od lewej do prawej (LTR), czy od prawej do lewej (RTL). Wartość domyślna to LTR.

  • ignoreWidth- Wskazuje, czy tabela przestawna będzie rozciągać się poza początkowy limit szerokości tabeli przestawnej i nie generuje podziałów kolumn. W przeciwnym razie zatrzyma renderowanie kolumn w ramach ograniczenia szerokości tabeli przestawnej i będzie kontynuował wyświetlanie pozostałych kolumn dopiero po rozpoczęciu renderowania wszystkich wierszy. Wartość domyślna to false .

Elementy podrzędne

Element <crosstab> ma następujące elementy podrzędne -

  • <reportElement>- Ten element definiuje pozycję, szerokość i wysokość tabeli przestawnej wewnątrz otaczającej go tabeli przestawnej. Atrybuty tego elementu obejmują wszystkie standardowe atrybuty <reportElement>.

  • <crosstabParameter>- Ten element służy do uzyskiwania dostępu do zmiennych raportu i parametrów z poziomu tabeli przestawnej. Atrybuty tego elementu obejmują -

    • name - określa nazwę parametru.

    • class - wskazuje klasę parametru.

  • <parametersMapExpression>- Ten element służy do przekazywania zmiennej raportu lub parametru zawierającego instancję java.util.Map jako zestaw parametrów tabeli przestawnej. Ten element nie zawiera atrybutów.

  • <crosstabDataset>- Ten element definiuje zbiór danych, który ma być użyty do wypełnienia tabeli przestawnej (szczegółowe wyjaśnienie znajduje się w następnej sekcji). Atrybuty tego elementu obejmują -

    • isDataPreSorted - wskazuje, czy dane w zestawie danych są wstępnie posortowane. Wartość domyślna to false .

  • <crosstabHeaderCell>- Ten element definiuje zawartość regionu znajdującego się w lewym górnym rogu tabeli przestawnej, gdzie spotykają się nagłówki kolumn i wierszy. Rozmiar tej komórki jest obliczany automatycznie na podstawie zdefiniowanych szerokości i wysokości wierszy i kolumn.

  • <rowGroup>- ten element definiuje grupę używaną do dzielenia danych na wiersze. Atrybuty tego elementu obejmują -

    • name - określa nazwę grupy wierszy.

    • szerokość - określa szerokość grupy wierszy.

    • headerPosition - określa pozycję zawartości nagłówka (góra, środek, dół, rozciągnięcie).

    • totalPosition - definiuje pozycję całej kolumny (początek, koniec, brak).

    Ten element zawiera następujące elementy podrzędne -

    • <bucket>

    • <crosstabRowHeader>

    • <crosstabTotalRowHeader>

  • <columnGroup>- ten element definiuje grupę używaną do dzielenia danych na kolumny. Atrybuty tego elementu obejmują -

    • name - określa nazwę grupy kolumn.

    • wysokość - określa wysokość nagłówka grupy kolumn.

    • headerPosition - określa położenie zawartości nagłówka ( prawy, lewy, środkowy, rozciągnięty ).

    • totalPosition - definiuje pozycję całej kolumny ( początek, koniec, brak ).

    Ten element zawiera następujące elementy podrzędne -

    • <bucket>

    • <crosstabColumnHeader>

    • <crosstabTotalColumnHeader>

  • <measure>- Ten element definiuje obliczenia, które mają być wykonywane w wierszach i kolumnach. Atrybuty tego elementu obejmują -

    • nazwa - określa nazwę miary.

    • klasa - wskazuje klasę miary.

    • obliczenia - wskazuje obliczenia, które mają być wykonane między wartościami komórek tabeli przestawnej. Jego wartości mogą być dowolne z następujących - Nothing, Count, DistinctCount, Sum, Average, Lowest, Highest, StandardDeviation, Variance i First . Wartość domyślna toNothing.

  • <crosstabCell>- Ten element określa, w jaki sposób będą układane dane w komórkach niebędących nagłówkami. Atrybuty tego elementu obejmują -

    • columnTotalGroup - wskazuje grupę, która ma zostać użyta do obliczenia sumy kolumny.

    • wysokość - określa wysokość komórki.

    • rowTotalGroup - wskazuje grupę, która ma zostać użyta do obliczenia sumy wiersza.

    • szerokość - określa szerokość komórki.

  • <whenNoDataCell>- Ten element definiuje, co ma być wyświetlane w pustej komórce tabeli przestawnej. Ten element nie zawiera atrybutów.

Grupowanie danych w tabeli przestawnej

Silnik obliczeń tabeli przestawnej agreguje dane, wykonując iterację w powiązanych rekordach zestawu danych. Aby zagregować dane, należy je najpierw pogrupować. W tabeli przestawnej wiersze i kolumny są oparte na określonych elementach grupy, tzwbuckets. Definicja zasobnika powinna zawierać -

  • bucketExpression - wyrażenie, które ma zostać ocenione w celu uzyskania elementów grupy danych.

  • ComparatorExpression - potrzebny w przypadku, gdy naturalne uporządkowanie wartości nie jest najlepszym wyborem.

  • orderByExpression - wskazuje wartość używaną do sortowania danych.

Grupy wierszy i kolumn (zdefiniowane powyżej) w tabeli przestawnej zależą buckets.

Wbudowane zmienne całkowite tabeli krzyżowej

Poniżej znajduje się lista aktualnych wartości miary oraz sumy różnych poziomów odpowiadające komórce, do których można uzyskać dostęp poprzez zmienne nazwane zgodnie z poniższym schematem -

  • Bieżąca wartość obliczenia miary jest przechowywana w zmiennej o tej samej nazwie co miara.

  • <Measure> _ <Column Group> _ALL - Zwraca sumę wszystkich wpisów w grupie kolumn z tego samego wiersza.

  • <Measure> _ <Row Group> _ALL - Zwraca sumę wszystkich wpisów w grupie wierszy z tej samej kolumny.

  • <Measure> _ <Row Group> _ <Column Group> _ALL - Daje to połączoną sumę odpowiadającą wszystkim wpisom w grupach wierszy i kolumn.

Przykład

Aby zademonstrować tabele przestawne, napiszmy nowy szablon raportu (jasper_report_template.jrxml). Tutaj dodamy tabelę przestawną do sekcji podsumowania. Zapisz go w kataloguC:\tools\jasperreports-5.0.1\test. Zawartość pliku jest taka, jak podano poniżej -

<?xml version = "1.0" encoding = "UTF-8"?>

<!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" language = "groovy" pageWidth = "595"
   pageHeight = "842" columnWidth = "555" leftMargin = "20" rightMargin = "20"
   topMargin = "20" bottomMargin = "20">

   <parameter name = "ReportTitle" class = "java.lang.String"/>
   <parameter name = "Author" class = "java.lang.String"/>
   
   <field name = "name" class = "java.lang.String"/>
   <field name = "country" class = "java.lang.String"/>
   
   <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> <summary> <band height = "60"> <crosstab> <reportElement width = "782" y = "0" x = "0" height = "60"/> <rowGroup name = "nameGroup" width = "100"> <bucket> <bucketExpression class = "java.lang.String"> <![CDATA[$F{name}]]>
               </bucketExpression>
            </bucket>
            
            <crosstabRowHeader>
            
               <cellContents>
                  <box border = "Thin" borderColor = "black"/>
                  
                  <textField>
                     <reportElement width = "100" y = "0" x = "0" height = "20"/>
                     <textElement textAlignment = "Right" 
                        verticalAlignment = "Middle"/>
                     
                     <textFieldExpression>
                        <![CDATA[$V{nameGroup}]]> </textFieldExpression> </textField> </cellContents> </crosstabRowHeader> </rowGroup> <columnGroup name = "countryGroup" height = "20"> <bucket> <bucketExpression class = "java.lang.String"> $F{country}
               </bucketExpression>
            </bucket>
            
            <crosstabColumnHeader>
               <cellContents>
                  <box border = "Thin" borderColor = "black"/>
                  <textField isStretchWithOverflow = "true">
                     <reportElement width = "60" y = "0" x = "0" height = "20"/>
                     <textElement verticalAlignment = "Bottom"/>
                     <textFieldExpression>
                        <![CDATA[$V{countryGroup}]]> </textFieldExpression> </textField> </cellContents> </crosstabColumnHeader> </columnGroup> <measure name = "tailNumCount" class = "java.lang.Integer" calculation = "Count"> <measureExpression>$F{country}</measureExpression>
         </measure>
         
         <crosstabCell height = "20" width = "60">
            <cellContents backcolor = "#FFFFFF">
               <box borderColor = "black" border = "Thin"/>
               <textField>
                  <reportElement x = "5" y = "0" width = "55" height = "20"/>
                  <textElement textAlignment = "Left" 
                     verticalAlignment = "Bottom"/>
                  <textFieldExpression class = "java.lang.Integer">
                      $V{tailNumCount}
                  </textFieldExpression>
               </textField>
            </cellContents>
         </crosstabCell>
      
      </crosstab>
      
      </band>
   </summary>
	
</jasperReport>

Szczegóły powyższego pliku są następujące -

  • Crosstab jest definiowany przez element <crosstab>.

  • Element <rowGroup> definiuje grupę do podziału danych na wiersze. Tutaj w każdym wierszu będą wyświetlane dane dla innej nazwy.

  • Elementy <bucket> i <bucketExpression> definiują, które wyrażenie raportu ma być używane jako separator grupy dla <rowGroup>. Tutaj użyliśmy pola nazwy jako separatora, aby podzielić wiersze według nazwy.

  • Element <crosstabRowHeader> definiuje wyrażenie, które ma być używane jako nagłówek wiersza. Zawiera pojedynczy element podrzędny, a mianowicie <cellContents>, który działa jak wewnętrzne pasmo w tabeli przestawnej. Zamiast definiować nazwę zmiennej dla pola tekstowego wewnątrz <crosstabRowHeader>, przypisaliśmy nazwę do <rowGroup> (poprzez jej atrybut name), dzięki czemu tworzy ona niejawną zmienną. Element <crosstabRowHeader> definiuje zawartość komórki nagłówka dla całego wiersza. Jako jedyny element podrzędny przyjmuje pojedynczy element <cellContents>.

  • Element <columnGroup>, jak również jego elementy podrzędne, są analogiczne do elementu <rowGroup>, z tą różnicą, że wpływa na kolumny zamiast na wiersze.

  • Element <measure> definiuje obliczenia, które mają być wykonywane w wierszach i kolumnach. Kalkulacja atrybut jest ustawiony na hrabiego .

  • Element <crosstabCell> definiuje sposób rozmieszczenia danych w komórkach niebędących nagłówkami. Ten element zawiera również pojedynczy element <crosstabCell> jako jedyny element podrzędny.

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ą następujące -

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ą następujące -

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

Następnie skompilujmy i uruchommy powyższe pliki przy użyciu naszego zwykłego procesu kompilacji 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 należy go umieścić w tym samym katalogu co 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 (viewFullReport jest domyślnym celem) w następujący sposób -

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

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
   [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.

BUILD SUCCESSFUL
Total time: 20 minutes 53 seconds

W wyniku powyższej kompilacji otworzy się okno JasperViewer, jak pokazano na poniższym ekranie -

Tutaj widzimy, że każdy kraj i nazwa są zestawione w tabeli.

Czasami potrzebujemy raportów w różnych językach. Pisanie tego samego raportu w każdym języku wiąże się z dużą ilością zbędnej pracy. Tylko fragmenty tekstu różniące się w zależności od języka powinny być napisane osobno i załadowane do elementów tekstowych w czasie wykonywania, w zależności od ustawień regionalnych. Taki jest cel internacjonalizacji raportu. Międzynarodowe raporty, raz napisane, mogą działać wszędzie.

W kolejnych krokach wymieniliśmy, jak wygenerować raport w różnych językach, a także kilka innych funkcji internacjonalizacji raportów -

  • Skojarz pakiet zasobów java.util.ResourceBundle z szablonem raportu. Istnieją dwa sposoby powiązania obiektu java.util.ResourceBundle z szablonem raportu.

    • W czasie projektowania przez ustawienie atrybutu resourceBundle obiektu szablonu raportu na nazwę podstawową docelowego pakunku zasobów.

    • Skojarzenie dynamiczne / wykonawcze można utworzyć, podając obiekt java.util.ResourceBundle jako wartość parametru REPORT_RESOURCE_BUNDLE w czasie wypełniania raportu.

    • Jeśli raport ma zostać wygenerowany w ustawieniach regionalnych innych niż bieżące, wbudowany parametr REPORT_LOCALE może zostać użyty do określenia ustawień narodowych środowiska wykonawczego podczas wypełniania raportu.

  • Aby ułatwić umiędzynarodowienie raportów, specjalna składnia $R{}jest dostępny w wyrażeniach raportu, aby odwoływać się do zasobów java.lang.String umieszczonych w obiekcie java.util.ResourceBundle powiązanym z raportem. Plik$R{} składnia znaków wyodrębnia zasób specyficzny dla lokalizacji z pakietu zasobów na podstawie klucza, który należy umieścić w nawiasach -

<textFieldExpression>
   $R{report.title}
</textFieldExpression>

Powyższe pole tekstowe wyświetla tytuł raportu poprzez wyodrębnienie wartości String z pakietu zasobów skojarzonego z szablonem raportu na podstawie ustawień regionalnych dostarczonych w czasie wykonywania i klucza report.title .

  • Formatując wiadomości w różnych językach w oparciu o ustawienia regionalne raportu, w raportach net.sf.jasperreports.engine.fill.JRCalculator jest wbudowana metoda . Ta metoda oferuje funkcjonalność podobną do klasy java.text.MessageFormat . Ta metoda, msg (), ma trzy wygodne sygnatury, które pozwalają na użycie do trzech parametrów wiadomości w wiadomościach.

  • Wbudowana metoda str () (odpowiednik składni $ R {} wewnątrz wyrażeń raportu), która zapewnia dostęp do zawartości pakietu zasobów w oparciu o ustawienia regionalne raportu.

  • W przypadku formatowania daty i czasu można użyć wbudowanego parametru REPORT_TIME_ZONE, aby zapewnić prawidłowe przekształcenia czasu.

  • W wygenerowanych wynikach biblioteka przechowuje informacje o kierunku wykonywania tekstu, dzięki czemu dokumenty wygenerowane w językach z zapisem od prawej do lewej (jak arabski i hebrajski) mogą być poprawnie renderowane.

  • Jeśli aplikacja korzysta z wbudowanej przeglądarki Swing do wyświetlania wygenerowanych raportów, należy ją umiędzynarodowić, dostosowując przycisk Etykietki narzędzi lub inne wyświetlane teksty. Jest to bardzo łatwe do zrobienia, ponieważ przeglądarka polega na predefiniowanym pakiecie zasobów w celu wyodrębnienia informacji specyficznych dla lokalizacji. Podstawowa nazwa tego pakietu zasobów to net.sf.jasperreports.view.viewer.

Przykład

Aby zademonstrować internacjonalizację, napiszmy nowy szablon raportu (jasper_report_template.jrxml). Zawartość JRXML jest podana poniżej. Zapisz go w katalogu C: \ tools \ jasperreports-5.0.1 \ test.

<?xml version = "1.0" encoding = "UTF-8"?>

<!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" language = "groovy" pageWidth = "595"
   pageHeight = "842" columnWidth = "555" leftMargin = "20" rightMargin = "20"
   topMargin = "20" bottomMargin = "20" resourceBundle = "localizationdemo">
   
   <title>
      <band height = "552">
         
         <textField>
            <reportElement positionType = "Float" x = "150" y = "20" 
               width = "400" height = "50"/>
            
            <textElement>
               <font size = "24"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{REPORT_LOCALE}.getDisplayName ($P{REPORT_LOCALE})]]>
            </textFieldExpression>
         </textField>

         <textField isStretchWithOverflow = "true" isBlankWhenNull = "true">
            <reportElement positionType = "Float" x = "20" y = "125" 
               width = "530" height = "20"/>
            
            <textElement textAlignment = "Justified">
               <font size = "14"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$R{localization.text1}]]>
            </textFieldExpression>
         
         </textField>
      
      </band>
   </title>

</jasperReport>

W powyższym pliku, ResourceBundle atrybutem <jasperReport> element opowiada JasperReports gdzie uzyskać zlokalizowane ciągi do stosowania do raportu. Musimy utworzyć plik właściwości z nazwą główną odpowiadającą wartości atrybutu. Ten plik musi istnieć w dowolnym miejscu w CLASSPATH podczas wypełniania raportu. W tym przykładzie plik właściwościlocalizationdemo.properties jest zapisywany w katalogu C:\tools\jasperreports-5.0.1\test. Zawartość tego pliku jest następująca -

localization.text1 = This is English text.

Aby użyć innego ustawienia narodowego, plik musi mieć nazwę localizationdemo [locale] .properties. Tutaj napiszemy plik dla hiszpańskich ustawień regionalnych. Zapisz ten plik jako -C:\tools\jasperreports-5.0.1\test\localizationdemo_es.properties. Zawartość tego pliku jest następująca -

localization.text1 = Este texto es en Español.

Składnia służąca do uzyskania wartości właściwości resourceBundle to $ R {klucz}.

Aby JasperReports wiedział, jakiego języka chcemy użyć, musimy przypisać wartość do wbudowanego parametru. Nazwa tego parametru jest zdefiniowana jako stała o nazwie REPORT_LOCALE, a ta stała jest zdefiniowana w klasie net.sf.jasperreports.engine.JRParameter . Wartość stałej musi być instancją java.util.Locale . Ta logika jest włączona do kodu java w celu wypełnienia i wygenerowania raportu. Zapiszmy ten plikJasperReportFillI18.javado katalogu C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint. Zawartość pliku jest następująca -

package com.tutorialspoint;

import java.util.HashMap;
import java.util.Locale;

import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JasperFillManager;

public class JasperReportFillI18 {

   public static void main(String[] args) {
      String sourceFileName = "C://tools/jasperreports-5.0.1/test/"
         + "jasper_report_template.jasper";
      HashMap parameterMap = new HashMap();
      if (args.length > 0) {
         parameterMap.put(JRParameter.REPORT_LOCALE, new Locale(args[0]));
      }
      try {
         JasperFillManager.fillReportToFile(sourceFileName, null, 
            new JREmptyDataSource());
      } catch (JRException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }

   }
}

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 należy go umieścić w tym samym katalogu co 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.JasperReportFillI18 (viewFullReport jest domyślnym celem) w następujący sposób -

C:\tools\jasperreports-5.0.1\test>ant  -Dmain-class=com.tutorialspoint.JasperReportFillI18
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
   [javac] Compiling 1 source file to C:\tools\jasperreports-5.0.1\test\classes
   [javac] Note: C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\
      JasperReportFillI18.java
   uses unchecked or u
   [javac] Note: Recompile with -Xlint:unchecked for details.

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.JasperReportFillI18
   [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.

BUILD SUCCESSFUL
Total time: 3 minutes 28 seconds

W wyniku powyższej kompilacji otworzy się okno JasperViewer, jak pokazano na poniższym ekranie -