JasperReports. Fachhochschule Nordwestschweiz FHA University of Applied Sciences Aargau. Seminarbericht. a.missio@stud.fh-aargau.



Ähnliche Dokumente
Die Textvorlagen in Microsoft WORD und LibreOffice Writer

L10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016

Dokumentation von Ük Modul 302

Hilfe Bearbeitung von Rahmenleistungsverzeichnissen

Access [basics] Rechnen in Berichten. Beispieldatenbank. Datensatzweise berechnen. Berechnung im Textfeld. Reporting in Berichten Rechnen in Berichten

Was ist PDF? Portable Document Format, von Adobe Systems entwickelt Multiplattformfähigkeit,

32.4 Anpassen von Menüs und Symbolleisten 795i

Berechnungen in Access Teil I

teischl.com Software Design & Services e.u. office@teischl.com

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Artikel Schnittstelle über CSV

Die Beschreibung bezieht sich auf die Version Dreamweaver 4.0. In der Version MX ist die Sitedefinition leicht geändert worden.

Satzhilfen Publisher Seite Einrichten

4 Aufzählungen und Listen erstellen

Erzherzog Johann Jahr 2009

3. GLIEDERUNG. Aufgabe:

Herstellen von Symbolen mit Corel Draw ab Version 9

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Handbuch Fischertechnik-Einzelteiltabelle V3.7.3

Informationen zu den regionalen Startseiten

Text Formatierung in Excel

Datenbanken Kapitel 2

Ein PDF erstellen. aus Adobe InDesign CC. Langner Marketing Unternehmensplanung Metzgerstraße Reutlingen

Proseminar: Website-Managment-System. NetObjects Fusion. von Christoph Feller

Upgrade auf die Standalone Editionen von Acronis Backup & Recovery 10. Technische Informationen (White Paper)

5.2 Neue Projekte erstellen

Arbeiten mit UMLed und Delphi

.htaccess HOWTO. zum Schutz von Dateien und Verzeichnissen mittels Passwortabfrage

MdtTax Programm. Programm Dokumentation. Datenbank Schnittstelle. Das Hauptmenü. Die Bedienung des Programms geht über das Hauptmenü.

1 Einleitung. Lernziele. das Drucklayout einer Tabelle mit der Seitenansicht kontrollieren

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Anzeige von eingescannten Rechnungen

Mit der Maus im Menü links auf den Menüpunkt 'Seiten' gehen und auf 'Erstellen klicken.

Diese Ansicht erhalten Sie nach der erfolgreichen Anmeldung bei Wordpress.

JSP JSTL. JEE Vorlesung Teil 6. Ralf Gitzel

Flyer, Sharepics usw. mit LibreOffice oder OpenOffice erstellen

NEUES BEI BUSINESSLINE WINDOWS

Textgestaltung mit dem Editor TinyMCE Schritt für Schritt

Viele Bilder auf der FA-Homepage

Einführung in die Java- Programmierung

Professionelle Seminare im Bereich MS-Office

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

In diesem Thema lernen wir die Grundlagen der Datenbanken kennen und werden diese lernen einzusetzen. Access. Die Grundlagen der Datenbanken.

12. Dokumente Speichern und Drucken

Klausurteilnehmer. Wichtige Hinweise. Note: Klausur Informatik Programmierung, Seite 1 von 8 HS OWL, FB 7, Malte Wattenberg.

Inhalt. 1 Einleitung AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER

UpToNet Workflow Workflow-Designer und WebClient Anwendung

Erstellung von Reports mit Anwender-Dokumentation und System-Dokumentation in der ArtemiS SUITE (ab Version 5.0)

Anleitung zum GEPA EXCEL Import Tool

Kommunikations-Management

Java Kurs für Anfänger Einheit 5 Methoden

Objektorientierte Programmierung

Dokumentation IBIS Monitor

Nach der Anmeldung im Backend Bereich landen Sie im Kontrollzentrum, welches so aussieht:

Version 1.0 Merkblätter

Hilfedatei der Oden$-Börse Stand Juni 2014

Wie kann ich in der Backstage-Ansicht eigene Dokumentationen einbinden?

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein.

Task: Nmap Skripte ausführen

Werbemittelverwaltung

PHP - Projekt Personalverwaltung. Erstellt von James Schüpbach

News & RSS. Einleitung: Nachrichten er-(veröffentlichen) und bereitstellen Nachrichten erstellen und bereitstellen

Suche schlecht beschriftete Bilder mit Eigenen Abfragen

Der Kalender im ipad

Web-Kürzel. Krishna Tateneni Yves Arrouye Deutsche Übersetzung: Stefan Winter

Erstellen von x-y-diagrammen in OpenOffice.calc

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Unsere Webapplikation erweitern

Comic Life 2.x. Fortbildung zum Mediencurriculum

So importieren Sie einen KPI mithilfe des Assistenten zum Erstellen einer Scorecard

Virtueller Seminarordner Anleitung für die Dozentinnen und Dozenten

kleines keyword brevier Keywords sind das Salz in der Suppe des Online Marketing Gordian Hense

Kapiteltests zum Leitprogramm Binäre Suchbäume

IBM Software Demos Tivoli Provisioning Manager for OS Deployment

Anwendungsbeispiele. Neuerungen in den s. Webling ist ein Produkt der Firma:

Anleitung für das Content Management System

Bedienung von BlueJ. Klassenanzeige

2.1 Briefkopf Klicken Sie im Menü Einstellungen auf den Button Briefkopf. Folgendes Formular öffnet sich:

Bauteilattribute als Sachdaten anzeigen

Dokumentation für das Spiel Pong

Excel Pivot-Tabellen 2010 effektiv

Ein Poster mit Inkscape

Kommunikations-Management

ODBC-Treiber Programmübersicht

SPS-Bearbeitung mit EPLAN 5.70

Im Original veränderbare Word-Dateien

Typo3 - Inhalte. 1. Gestaltung des Inhaltsbereichs. 2. Seitenunterteilung einfügen

Funktionsbeschreibung Website-Generator

Webalizer HOWTO. Stand:

Vorbereitung einer Grafik zum Druck einer Glotze aus, Stadion an! -Zaunfahne Torsten Bunde, Stand 5. Juli 2014

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Die Excel Schnittstelle - Pro Pack

Informatik 1 Tutorial

Qt-Projekte mit Visual Studio 2005

Kapitel 3 Frames Seite 1

Ein Bild in den Text einfügen

Anton Ochsenkühn. amac BUCH VERLAG. Ecxel für Mac. amac-buch Verlag

Arbeit mit dem Reportgenerator

OP-LOG

Tutorium Informatik 1. Aufgabe 2: Formatierte Ein- und Ausgabe

Transkript:

Seminarbericht JasperReports Fachhochschule Nordwestschweiz FHA University of Applied Sciences Aargau Autor: Missio Adelchi a.missio@stud.fh-aargau.ch Studiengang Vertiefung Dozent Informatik Enterprise Computing Prof. Dr. Dominik Gruntz Windisch, 18. Juli 2004

Abstract JasperReports ist ein in Java geschriebenes open-source Reporting Tool. Es ist in der Lage dynamisch generierte grafische Erzeugnisse auf Monitor, Drucker oder in Dateiformate wie PDF, HTML, XML, XLS, CSV auszugeben. Es eignet sich für den Einsatz in Desktop Java Applikationen, Servlet- oder EJB-Container. JasperReports benutzt für das Layout eine eigene XML-Beschreibungssyntax. Daten bezieht es aus verschiedenste Datenquellen wie Relationale Datenbanken oder Arrays und Collections mit beliebigen Java Objekten. A.Missio, FH-Aargau 2/51

Inhaltsverzeichnis 1 Einführung...4 2 Was ist ein Reporting Tool...4 2.1 Struktur eines Reports...4 2.2 Zusammenfügen von Report und Daten...6 2.3 Export des Reports...6 3 JasperReports...6 3.1 Funktionsweise von JasperReports...9 3.1.1 Kompilationsprozess...11 3.1.2 Füllprozess...12 3.1.3 Exportprozess...12 3.1.3.1 Anzeige auf Monitor...13 3.1.3.2 Druck...13 3.1.3.3 Export in das PDF-Format...13 3.1.3.4 Export in das XLS-Format...14 3.1.3.5 Export in das HMTL-Format...14 3.2 Struktur des Reports...14 3.3 Elemente des Reports...20 3.3.1 Text Elemente...22 3.3.1.1 statische Textfelder...23 3.3.1.2 dynamische Textfelder...23 3.3.2 Grafische Elemente...25 3.3.2.1 Linien...26 3.3.2.2 Rechtecke...26 3.3.2.3 Bilder...26 3.3.3 Hyperlinks...28 3.3.4 Element Gruppen...28 3.3.5 Subreports...29 3.4 Daten und Datenübergabe...30 3.4.1 Parameter...30 3.4.2 Datenquelle...31 3.4.3 Felder...31 3.4.4 Ausdrücke oder Expressions...32 3.4.5 Variablen...33 3.5 Requirements...35 4 Beispiele...36 5 ireport...39 6 Quellen...40 7 Anhang...40 7.1 Rechnungs-XML-Datei...40 A.Missio, FH-Aargau 3/51

Einführung 1 Einführung Welche/r Programmierer/in ist nicht schon an das Problem gestossen, Daten etwas ansprechend ausdrucken oder darstellen zu müssen. Die meisten Programmiersprachen bieten von Hause aus dafür nur wenig Unterstützung. In dieser Lücke fügen sich Reporting Tools wie JasperReports. Historisch betrachtet waren die ersten Werkzeuge dieser Art hauptsächlich kommerziell oder zumindest Bestandteil kommerzieller Datenbank Management Systemen. Eines der bekanntesten Reporting Tools ist wohl Crystal Reports, das insbesondere im Visual Basic Umfeld grosser Beliebtheit geniesst und die Entwicklung weiterer Reporting Tools stark beeinflusst hat. Diverse opensource Projekte haben mittlerweile ebenfalls ein hohes Niveau erreicht. Darunter zählen unter anderem JasperReports, JFreeReport und DataVision. 2 Was ist ein Reporting Tool Ein Reporting Tool zu definieren ist kein einfaches Unterfangen. Vielleicht ist folgende Aussage die zutreffendste: Ein Reporting Tool ermöglicht es das Layout eines Druckerzeugniss zu definieren, es mit Daten zu versehen und es in möglichst viele Dateiformate oder Darstellungsmedien exportieren bzw. anzuzeigen zu können. Aus der Definition lässt sich ableiten, dass ein Reporting Tool aus drei Grundkomponenten besteht. Die erste definiert das Layout. Eine weitere ergänzt es mit Daten aus verschiedensten Quellen und die letzte Komponente exportiert es in das gewünschte Dateiformat, stellt es auf den Bildschirm dar oder sendet es dem Drucker. 2.1 Struktur eines Reports Ein Report wird von den meisten Reporting Tools grob in 5 Sektionen unterteilt. Sie lauten meist Page Header, Report Header, Detail, Report Footer und Page Footer. Jede Sektion definiert ein Teil des Dokument. Während der Kombination von Layout und Daten werden die benötigten Sektionen einfach wiederholt. Zu diesen 5 Grundsektionen kommen je nach Reporting Tool noch weitere hinzu, wie in Abbildung 1 beispielsweise der Group Header, welcher mit einem entsprechender Group Footer ergänzt werden kann. Diese Abbildung stellt eine hypothetische Rechnung dar. Es ist ersichtlich wie das Reporting Tool Daten, hier Artikel mit Bezeichnung und Preis, mit entsprechenden detail-sektionen darstellt. Sollte die Datenmengen den Inhalt einer Seite sprengen, wird automatisch eine Neue generiert. Jede Seite eines Reports beginnt im allgemeinen immer mit dem Page Header und wird mit einem Page Footer abgeschlossen, die genutzt werden um Kopf- und Fusszeile zu setzten. Die in Abbildung 1 dem Page Header folgende Sektion ist der Report Header, welcher nur ein A.Missio, FH-Aargau 4/51

Struktur eines Reports Mal am Anfang des Reports gesetzt wird. Wir werden später sehen, wie diese Bereiche in JasperReports etwas anders bezeichnet werden. Es besteht in JasperReports beispielsweise die Möglichkeit auf der ersten Seite eines Dokument keinen Page Header und Page Footer auszugeben, um eine Titelseite zu generieren. Abbildung 1: Struktur des Layout Es können jeder Sektion grafische Elemente platziert werden, wobei wenige primitive Objekte wie Linien, Polygone und Textfelder in der Regel ausreichen, um selbst komplex gestaltete Dokumente zu generieren. Die meisten Reporting Tools erlauben zudem das Importieren und Platzieren von Bilder, was gestalterische Möglichkeiten erheblich erweitert. Ein etwas spezielles Element ist das Subreport, welches ermöglicht Reports ineinander zu verschachteln. Zu diesem Punkt spielt sich eine Eigenschaft hervor, die JasperReports zu dem Besten zurzeit erhältlichen open-source Reporting Tool erhebt. Es unterstützt das rekursive Einsetzen von Subreports. A.Missio, FH-Aargau 5/51

Zusammenfügen von Report und Daten 2.2 Zusammenfügen von Report und Daten In den Reporting Tools erster Generation musste Daten mittels SQL-Abfragen in das Report eingefügt werden. Aktuellere Werkzeuge stellen dem Entwickler mehr Möglichkeiten zur Verfügung, indem sie diverse Treiber bereit stellen, mit welche verschiedenste Datenquellen angesprochen werden können. In der Regel werden Daten aus Datenquellen stammen, die eine gewisse Ähnlichkeit mit dem Java-Objekt java.sql.resultset haben. Jede Zeile in dieser tabellarischen Darstellungsart wird das Reporting Tool sequentiell bearbeiten und eine entsprechende detail-sektion generieren. Hier lässt sich eine Schwäche dieses Konzepts erahnen. Daten, die in Baumähnlichen Strukturen abgelegt sind, lassen sich schlecht tabellarisch abbilden. Ein Beispiel dafür sind in erster Linie XML-Dokumente. JasperReports kann das Problem mit Subreports lösen. 2.3 Export des Reports In der Regel wird das Report vor und nach dem Ergänzen mit externen Daten in ein Reporting Tool-spezifisches Format abgelegt. Dieses wird in einem separaten Schritt in ein gängiges Dateiformat exportiert, oder direkt auf Drucker oder Monitor gesendet. In diesem Punkt erweist sich JasperReports als sehr flexibel. 3 JasperReports JasperReports ist ein mächtiges Werkzeug. Es wird seit September 2001 vom Rumänen Teodor Danciu entwickelt. JasperReports ist in der Lage aus den gängigsten Datenquellen auf Basis von Formatvorlagen druckfertigen Inhalt auf Drucker, Bildschirm oder in Dateien des Formats PDF, HTML, XLS, CSV oder XML zu exportieren. Weitere Formate sind in Bearbeitung und kommen dem Projekt laufend hinzu. JasperReports ist in Java geschrieben. Es kann in standalone Java-Applikationen, in Servlets sowie in EJB-Container verwendet werden. Eine der Stärken von JasperReports ist die rekursive Unterstützung von Subreports. Diese ermöglichen für jeden Datensatz eine quasi unbeschränkte Anzahl Seiten in verschiedensten Ausprägungen zu generieren. Die Definition des Layouts erfolgt in ein JasperReports-eigenes XML Format. Das Editieren solcher XML-Dateien lässt sich wie wir sehen werden dank den Einsatz grafischer Editoren wie ireport, sehr komfortabel erledigen. ireport ist wie JasperReports ein open-source Projekt. Dem wird in diesem Bericht noch ein Kapitel gewidmet. Die folgende Illustration zeigt ein minimales, mit ireports generiertes Report mit der entsprechenden XML-Datei HelloWorld.xml. A.Missio, FH-Aargau 6/51

JasperReports Abbildung 2: Minimales "Hello World" Report HelloWorld.xml <?xml version="1.0" encoding="utf-8"?> <!-- Created with ireport - A designer for JasperReports --> <!DOCTYPE jasperreport PUBLIC "//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd"> <jasperreport name="test" columncount="1" printorder="vertical" orientation="portrait" pagewidth="595" pageheight="842" columnwidth="535" columnspacing="0" leftmargin="30" rightmargin="30" topmargin="20" bottommargin="20" whennodatatype="nopages" istitlenewpage="false" issummarynewpage="false"> <background> <band height="0" issplitallowed="true" > </band> </background> <title> <band height="50" issplitallowed="true" > </band> A.Missio, FH-Aargau 7/51

JasperReports </title> <pageheader> <band height="50" issplitallowed="true" > </band> </pageheader> <columnheader> <band height="30" issplitallowed="true" > </band> </columnheader> <detail> <band height="100" issplitallowed="true" > <statictext> <reportelement mode="opaque" x="162" y="26" width="144" height="32" forecolor="#000000" backcolor="#ffffff" positiontype="fixrelativetotop" isprintrepeatedvalues="true" isremovelinewhenblank="false" isprintinfirstwholeband="false" isprintwhendetailoverflows="false"/> <textelement textalignment="center" verticalalignment="top" linespacing="single"> <font fontname="sansserif" pdffontname="helvetica" size="18" isbold="false" isitalic="false" isunderline="false" ispdfembedded ="false" pdfencoding ="CP1252" isstrikethrough="false" /> </textelement> <text><![cdata[hello World!!!]]></text> </statictext> </band> </detail> <columnfooter> <band height="30" issplitallowed="true" > </band> </columnfooter> <pagefooter> <band height="50" issplitallowed="true" > </band> </pagefooter> <summary> <band height="50" issplitallowed="true" > </band> </summary> </jasperreport> A.Missio, FH-Aargau 8/51

JasperReports Die Abbildung 3 zeigt ein etwas komplexeres Beispiel. Es wurde ebenfalls mit JasperReports generiert, aber zudem in HTML exportiert. Es stellt eine fiktive Rechnung dar. Das HTML-Format erlaubt es, durch Verändern des border-attributs des table- Elements den Tabellenrand hervorzuheben. Sämtliche Elemente werden in einer Zelle dieser Tabelle platziert. Der Aufbau des Layouts in einer solchen Tabelle ermöglicht das pixelgenaue Platzieren sämtlicher Elemente des Reports. Eine der Schwächen von JasperReports erweist sich im RTF-Format-Export. Dieses Format kennt keine Gitterstrukturen und ermöglicht so keine pixelgenaue Platzierung von Elemente. Die Abbildung zeigt grob die Bereiche, in die das Reports eingeteilt ist. Es sind die Sektionen title, pageheader detail und summary sichtbar. Auf die Struktur der Reports wird im Kapitel 3.2 tiefer eingegangen. Abbildung 3 HTML Export mit hervorgehobenen Tabellenrand 3.1 Funktionsweise von JasperReports Wie die meisten Reporting Tools besteht JasperReports aus drei Grundkomponenten. A.Missio, FH-Aargau 9/51

Funktionsweise von JasperReports Die erste kompiliert eine XML-Datei, in welcher das Layout definiert ist. In der XML- Datei sind die Dimensionen der einzelnen Sektionen, der Seite und der Elemente definiert. Die Syntax ist intuitiv, da Tags wie rectangle oder textarea benutzt werden. Der Einarbeitungsaufwand liegt etwa wie komplexem HTML. Als Grösseneinheit wird die Einheit Pixel verwendet, Anhand der Konstante 72dpi lassen sich die Dimensionen in Inch bzw. metrische Einheiten umrechnen. Eine A4 Seite im Hochformat hat beispielsweise eine Höhe von 842 und eine Breite von 595 Pixel. In den Dokument können, je nach dem was für Datenquellen angegeben werden, auch SQL-Abfragen stehen. Abbildung 4: Klassenübersicht Das XML-Dokument wird vom JasperCompileManager (siehe Abbildung 1 4) anhand einer DTD validiert, in Java Quellcode überführt und kompiliert. Das resultierende Objekt nennt sich JasperReports. Es repräsentiert das Layout ohne dynamische Daten. In der Regel wird es zur Wiederverwendung serialisiert und in einer Datei mit der Endung jasper auf das Dateisystem geschrieben. Diese Datei stellt die Grundlage des Reports dar. Dieser Kompilationsprozess soll idealerweise im Vorfeld und nicht zur Laufzeit erfolgen, da es prozessor- und speicherintensiv ist. Da nicht auf jedes System ein JDK installiert sein muss, erlaubt es JasperReports auf einen alternativen Compiler zurückzugreifen, wie der im Paket BeanShell 2. JasperReports stellt zudem das Interface JRCompiler zur Verfügung, um weitere Compiler einzubinden. Die generierte Jasper-Datei wird mittels JasperFillManager mit Daten ergänzt, wie es in Abbildung 4 und 5 schematisch dargestellt ist. Dies geschieht auf 2 verschiedene Weisen. Die einfachste besteht darin, im Report selbst SQL-Abfragen zu definieren und das Lesen der Daten an JasperReports zu delegieren. Das einzige Objekt, das dabei 1 Aus The JasperReports Ultimate Guide - siehe Quellen 2 siehe Requirements A.Missio, FH-Aargau 10/51

Funktionsweise von JasperReports dem JasperFillManager übergeben werden muss, ist eine java.sql.connection, die mit der Datenbank verbunden sein muss. Alternativ dazu kann eine Implementation des Interfaces JRDataSource übergeben werden. Es gibt im JasperReports Paket diverse solche Implementationen, auf die wir nicht näher eingehen. Nebst einer DataSource lassen sich auch verschiedene, in einer java.util.map verpackte, Parameter übergeben. Abbildung 5: Schematische Funktionsweise Das Resultat des Füllprozess ist ein JasperPrint-Objekt, das sich analog zum JasperReports-Objekt serialisieren und auf das Dateisystem schreiben lässt. Oft wird es aber im Speicher belassen und direkt mit dem JasperPrintManager auf das gewünschte Ausgabemedium oder über den JasperExportManager in ein Dateiformat überführt. Dieses JasperPrint-Objekt ist das fertige Druckerzeugnis im JasperReports eigenen Format, genau so wie es beispielsweise Word Dateien für das MS Word Programm sind. Diese drei Prozesse lassen sich programmatisch mit einer erschreckender Einfachheit ausführen. Im Extremfall lässt sich ein Report auf einer Zeile kompilieren, füllen und in PDF-Format als byte-array zurückgeben. Der Verfasser dieses Berichts schätzt den Gestaltungs- und XML-Vorbereitungsaufwand subjektiv um den Faktor 10 höher ein als die programmatische Implementierung des Füll und Exportprozess. 3.1.1 Kompilationsprozess Das Report wird mit dem JasperCompileManager kompiliert. Diverse statische compilereporttofile-, compilereporttostream- und compilereport-methoden bieten die verschiedensten Möglichkeiten, um aus der XML-Datei ein JasperReports Objekt zu A.Missio, FH-Aargau 11/51

Kompilationsprozess generieren. Mit compilereporttofile wird eine dem XML-Report gleichnamigen Datei mit der Endung.jasper erzeugt. JasperCompileManager.compileReportToFile("/path-to/report.xml"); Von der statischen Methode compilereport wird ein JasperReports-Objekt zurückgeben. JasperReports jr = JasperCompileManager.compileReport("/pathto/report.xml"); 3.1.2 Füllprozess Das Report lässt sich ebenfalls mit einem Methodenaufruf mit Daten füllen. Dabei werden Parameter und Datenbankverbindung bzw. Datenquelle übergeben. // Parameter vorbereiten Map parameters = new HashMap(); parameters.put("reporttitel", "Dies ist mein Report"); parameters.put("rechnung", beliebigesrechnungsobjekt); // Report mit Daten aus einer JDBC Connection füllen... JasperFillManager.fillReportToFile("/path-to/report.jasper", parameters, datenbankconnection); //... oder mit Daten aus einer JRDataSource JasperFillManager.fillReportToFile("/path-to/report.jasper", parameters, jrresultsetdatasource); 3.1.3 Exportprozess Das Report kann in diverse Dateiformate exportiert werden oder direkt auf Drucker oder Monitor gedruckt bzw. angezeigt werden. A.Missio, FH-Aargau 12/51

Exportprozess 3.1.3.1 Anzeige auf Monitor Das Paket JasperReports hat ein eingebautes Anzeigeprogramm dori.jasper.view.jasperviewer. Es kann über die Kommandozeile aufgerufen werden. >java -classpath.;lib/jasperreports.jar dori.jasper.view.jasperviewer -FmeineJasperPrintDatei.jrprint 3.1.3.2 Druck JasperPrint Objekte sendet der JasperPrintManager an den Drucker. Mit der statischen Methode printreport kann im ersten Fall ohne und im zweiten Fall mit dem Standard- Druck-Dialog gedruckt werden. Im ersten Fall wird ein JasperPrint Objekt übergeben, im zweiten der Pfad zu einem serialisierten Objekt. JasperPrintManager.printReport(meinJasperPrintObjekt, false); JasperPrintManager.printReport("/path-to/report.jrprint", true); 3.1.3.3 Export in das PDF-Format Das JasperPrint Objekt lässt sich mit der statischen Methode exportreporttopdffile in die Datei report.pdf exportieren. JasperExportManager.exportReportToPdfFile("/path-to/report.jrprint"); Soll die PDF-Datei im Speicher anstatt auf das Dateisystem belassen werden kann die statische Methode exportreporttopdf verwendet werden. pdfbytearray = JasperExportManager.exportReportToPdf( "/path-to/report.jrprint"); A.Missio, FH-Aargau 13/51

Exportprozess 3.1.3.4 Export in das XLS-Format Das Export in das XLS Format weicht etwas vom PDF-Export ab. JRXlsExporter exporter = new JRXlsExporter(); exporter.setparameter(jrexporterparameter.jasper_print, jasperprint); exporter.setparameter(jrexporterparameter.output_file_name, "/path-to/report.xls"); exporter.setparameter(jrxlsexporterparameter.is_one_page_per_sheet, Boolean.FALSE); exporter.exportreport(); 3.1.3.5 Export in das HMTL-Format Export in HTML findet auf eine analoge Weise statt wie das Export in das PDF-Format. JasperExportManager.exportReportToHtmlFile("/path-to/report.jrprint"); 3.2 Struktur des Reports Das Report ist den Grundsektionen background, title, pageheader, columnheader, detail, columnfooter, pagefooter, summary gegliedert. Diese Sektionen enthalten ihrerseits alle eine Sektion band. Die weiter unten aufgeführte DTD, mit welcher die Syntax validiert wird, zeigt wie in jeder dieser Sektionen nur ein solches Element erlaubt ist. Diese band Elemente sind fakultativ. Man könnte demnach lauter leere Sektionen definieren, was höchstwahrscheinlich ein recht uninteressantes Dokument produzieren wird. jasperreport.dtd <!ELEMENT groupheader (band?)> <!ELEMENT groupfooter (band?)> <!ELEMENT background (band?)> <!ELEMENT title (band?)> <!ELEMENT pageheader (band?)> <!ELEMENT columnheader (band?)> A.Missio, FH-Aargau 14/51

Struktur des Reports <!ELEMENT detail (band?)> <!ELEMENT columnfooter (band?)> <!ELEMENT pagefooter (band?)> <!ELEMENT summary (band?)> <!ELEMENT band (printwhenexpression?, (line rectangle ellipse image statictext textfield subreport elementgroup)*)> <!ATTLIST band height NMTOKEN "0" issplitallowed (true false) "true"> Hier ein kurzer Auszug aus einem Report. Es steht für eine leere, also nicht genutzte background-sektion. Das Attribut issplitallowed ermöglicht es einer band sich über mehrere Seiten zu erstrecken, was bei der detail-sektion mit vielen Datensätzen oft zutreffen kann. Die Sektion detail ist in beliebig vielen Kolonnen unterteilbar. empty_report.xml <background> <band height="0" issplitallowed="true" > </band> </background> In der Abbildung 6 sind die Elemente in der leeren Dokumentstruktur eines ireport- Dokuments sichtbar. Auf das Tool ireport wird später noch weiter eingegangen. A.Missio, FH-Aargau 15/51

Struktur des Reports Abbildung 6: Struktur eines leeren JasperReports Dokument Abbildung 7: Struktur eines JasperReports Dokuments mit band-elemente A.Missio, FH-Aargau 16/51

Struktur des Reports Background Die Sektion background ermöglicht es dem Entwickler allen Seiten einen Hintergrund zu verpassen. Oft wird sie benutzt um einen Rahmen, um die ganze Seite zu ziehen. Die Höhe dieser Sektion kann die Höhe einer Seite nicht überschreiten. Title Die Sektion title kann mehr als bloss für einen Titel genutzt werden. In der fiktiven Rechnung in Abbildung 9 und 10 wird die Sektion title unter anderem für Briefkopf, Rechnungstitel und Empfängeradresse genutzt. Es besteht die Möglichkeit, die Darstellung dieser Sektion auf einer einzelnen Seite zu erzwingen. Mit dem geschickten Einsatz von Subreports kann damit an jeder Stelle des Reports eine fiktive Titelseite generiert werden, um sie beispielsweise als Trennseite zu nutzen. Page header Der pageheader leitet jede Seite ein. In der Regel bleiben die Dimensionen dieser Sektion konstant. Dieses Element dient als Kopfzeile. In Abbildung 8 und 9 erkennt man wie der page header auf jeder Seite wiederholt wird. Column header Die detail-sektionen werden in Kolonnen organisiert, die von einem columnheader eingeleitet werden. Erfolgt ein Seitensprung wegen einer hohen Anzahl detail- Sektionen, kann ein Wiedereinfügen des columnheader auf der neuen Seite erzwungen werden. Diese Sektion verändert zur Laufzeit seine Dimensionen nie. Group header Der groupheader hat es nicht bis in die Abbildung 6 geschafft. Ein Report kann von keiner bis unendlich viele groupheader beinhalten. Das sind Sektionen, die das Gruppieren von Datensätze, die mit detail-sektionen dargestellt werden, ermöglichen. Die Gruppen werden mit groupheader eingeleitet und mit groupfooter abgeschlossen. Es folgt ein Auszug aus einem XML-Report und die dazu gehörende Ausgabe in Abbildung 3 8. Die Platzierung des group header auf einer neuen Seite oder einer neuen Kolonne kann erzwungen werden. Die groupexpression steuert des Verhalten der Gruppierung. Als groupexpression kann ein beliebiger Java Ausdruck stehen. Das $F{...} ist eine JasperReports-spezifische Syntax, auf die wir noch eingehen werden. Eine Gruppierung der Datensätze mach meist nur dann Sinn, wenn die Datensätze in der richtigen Reihenfolge vorliegen. JasperReports sortiert diese nicht. 3 Aus den Beispielen des JasperReports-Projekts A.Missio, FH-Aargau 17/51

Struktur des Reports customer.xml <group name="citygroup" minheighttostartnewpage="60"> <groupexpression> $F{City} </groupexpression> <groupheader> <band height="20"> : : Abbildung 8: Nach Städte gruppierte Datensätze Detail Das wohl wichtigste Element ist wohl die detail-sektion. Jedem Eintrag der Datenquelle entspricht ein detail-feld. Die meisten Elemente des Reports landen hier. Group footer Dem group header entsprechend kommt pro Gruppe ein groupfooter als Abschluss hinzu. Die Abbildung 7 zeigt ein solches. Column footer Der columnfooter schliesst jede Kolonne ab. Auch hier lassen sich Dimensionen nicht zur Laufzeit ändern. Page footer Der pagefooter repräsentiert die Fusszeile jeder Seite. Die Dimensionen lassen sich ebenfalls nicht zur Laufzeit ändern. Summary Diese Sektion wird in anderen Reporting Tools auch Report Footer genannt. Sie wird A.Missio, FH-Aargau 18/51

Struktur des Reports nur ein mal am Ende des Dokuments eingefügt. Sie erlaubt Summen, Durchschnitte, Schlussfolgerungen und sonstiges zu platzieren. In Abbildung 9 wird im summary die Summe aller verrechneten Posten angefügt. Abbildung 9: fiktive Rechnung, 1. Seite Enthält die übergebene Datenquelle keine Datensätze, so kann das Verhalten von JasperReports drei verschiedene Ausprägungen annehmen. Es kann eine leere Seite, gar keine Seite oder ein vollständiges Dokument ohne detail-sektionen generiert werden. A.Missio, FH-Aargau 19/51

Struktur des Reports Abbildung 10: fiktive Rechnung 2. Seite 3.3 Elemente des Reports JasperReports kennt zwei Element-Kategorien, Textelemente und grafische Elemente. Die Textelemente sind statictext und textfield, die grafischen Elemente line, rectangle, ellipse und image. Der textfield ist dem statictext ähnlich, nur wird der Inhalt des textfield zur Laufzeit generiert. Es lassen sich in einem textfield beliebige Java Code- Passagen platzieren. Jedes Element muss in einem band-element platziert werden. A.Missio, FH-Aargau 20/51

Elemente des Reports Die Attribute, welche diese Elemente im Gemeinsamen haben sind ihrerseits im Element reportelement zusammengefasst. Dieses muss, wie im wie im folgenden jasperreport.dtd Auszug sichtbar, zwingend vorhanden sein. jasperreport.dtd <!ELEMENT line (reportelement, graphicelement?)> Das Element reportelement in jasperreport.dtd: jasperreport.dtd <!ELEMENT reportelement (printwhenexpression?)> <!ATTLIST reportelement key NMTOKEN #IMPLIED positiontype (Float FixRelativeToTop FixRelativeToBottom) "FixRelativeToTop" stretchtype (NoStretch RelativeToTallestObject RelativeToBandHeight) "NoStretch" isprintrepeatedvalues (true false) "true" mode (Opaque Transparent) #IMPLIED x NMTOKEN #REQUIRED y NMTOKEN #REQUIRED width NMTOKEN #REQUIRED height NMTOKEN #REQUIRED isremovelinewhenblank (true false) "false" isprintinfirstwholeband (true false) "false" isprintwhendetailoverflows (true false) "false" printwhengroupchanges CDATA #IMPLIED forecolor CDATA #IMPLIED backcolor CDATA #IMPLIED > A.Missio, FH-Aargau 21/51

Elemente des Reports Die Position dieser Elemente wird in Pixelkoordinaten gemessen, Diese sind in den Attributen x und y festgelegt und beziehen sich auf das entsprechende Band-Element. Die Position kann drei verschiedene Eigenschaften annehmen. Standardmässig ist FixRelativeToTop gesetzt. Das Element wird dabei mit den gesetzten Koordinaten vom band-ursprung oben Links platziert. FixRelativeToBottom verhält sich wie FixRelativeToTop, nur dass die Koordinaten von unten Links anstatt oben Links gemessen werden. Ist das positiontype-attribut auf Float gesetzt, wird das Element von Elementen, dessen Grösse sich dynamisch ändern kann, um eine Überlappung zu vermeiden, verschoben. Abbildung 11 zeigt ein Snapshot aus einer ireport-session mit 3 Elemente. Es sind die pagetype-attribute und ihre Bedeutung dargestellt. Der Float- Pfeil soll schematisch darstellen, wie das erste Element den zweiten hinunter schiebt. Abbildung 11: positiontype-attribut in reportelement 3.3.1 Text Elemente Die Text Elemente gibt es in 2 Ausprägungen, statische und dynamische, statictext und textfield genannt. Beide Elemente haben gemeinsame Attribute, welche im Element textelement gruppiert sind. A.Missio, FH-Aargau 22/51

Text Elemente jasperreport.dtd <!ELEMENT statictext (reportelement, textelement?, text?)> <!ELEMENT textelement (font?)> <!ATTLIST textelement textalignment (Left Center Right Justified) "Left" verticalalignment (Top Middle Bottom) "Top" rotation (None Left Right) "None" linespacing (Single 1_1_2 Double) "Single" isstyledtext (true false) "false" > Diese Attribute des textelement-element sind den meisten Fachmänner/-frauen aus Textverarbeitungsprogramme bekannt. Auf die Schriften möchte ich nur kurz eingehen. JasperReports kennt logische (Serif, Sans-Serif, etc.) Schriften, wie sie in der Java Plattform definiert sind, und physische Schriften (Arial, Time, Helvetica, etc.). Diese können das Format TrueType oder PostScript Type 1 haben. Möchte der/ die EntwicklerIn eigene Schriften verwenden, können die Schriftendateien JasperReports mitgegeben werden. Das PDF-Format erlaubt das Einbetten von Schriften im Dokument. Dies kann mit dem Attribut ispdfembedded= true im Element font erreicht werden. Das ermöglicht eine originalgetreue Darstellung des Dokuments auf der Client-Seite. 3.3.1.1 statische Textfelder Statische Textfelder haben einen Inhalt, der sich während des Füllprozess des Reports nicht ändert. Sie bieten nur wenig Optionen und sind unkompliziert in der Verwendung. jasperreport.dtd <!ELEMENT statictext (reportelement, textelement?, text?)> <!ELEMENT text (#PCDATA)> 3.3.1.2 dynamische Textfelder Dynamischen Textfelder ist ein Ausdruck assoziiert, welches zur Laufzeit mit jeder Iteration interpretiert wird. Dieser Ausdruck heisst textfieldexpression. Die Höhe eines solchen Felds lässt sich im Vorfeld schlecht voraussagen. Demnach besteht mit dem A.Missio, FH-Aargau 23/51

Text Elemente Attribut isstretchwithoverflow= true die Möglichkeit JasperReports diesen Wert zur Laufzeit erhöhen zu lassen. Dieses Verhalten wird meist in der Detail-Sektion angewendet. In Abbildung 8 und 9 ist dieses Mechanismus sichtbar. Die letzten 5 Sektionen sind dem Overflow des ersten Feldes wegen in der Höhe angepasst. Der Inhalt eines TextField-Element wird mit dem Element textfieldexpression festgelegt. In dieser, wie in jeder anderen Expression auch, kann beliebiger Java Code stehen. Einzig der Rückgabewert muss ein Java Objekt sein, dessen Typ mit einem aus der folgenden Liste übereinstimmen muss: java.lang.boolean java.lang.byte java.util.date java.sql.timestamp java.lang.double java.lang.float java.lang.integer java.lang.long java.lang.short java.math.bigdecimal java.lang.string Ist nichts angegeben, wird implizit java.lang.string als Typ angenommen. jasperreport.dtd <!ELEMENT textfield (reportelement, textelement?, textfieldexpression?, anchornameexpression?, hyperlinkreferenceexpression?, hyperlinkanchorexpression?, hyperlinkpageexpression?)> <!ATTLIST textfield isstretchwithoverflow (true false) "false" evaluationtime (Now Report Page Column Group) "Now" evaluationgroup CDATA #IMPLIED pattern CDATA #IMPLIED isblankwhennull (true false) "false" A.Missio, FH-Aargau 24/51

Text Elemente hyperlinktype (None Reference LocalAnchor LocalPage RemoteAnchor RemotePage) "None" > <!ELEMENT textfieldexpression (#PCDATA)> <!ATTLIST textfieldexpression class (java.lang.boolean java.lang.byte java.util.date java.sql.timestamp java.sql.time java.lang.double java.lang.float java.lang.integer java.lang.long java.lang.short java.math.bigdecimal java.lang.number java.lang.string) "java.lang.string" > Im folgenden Beispiel wird an das Rechnung-Objekt, welches als Parameter übergeben wird, die Methode gettitel ausgeführt. Diese hat einen Rückgabewert des Typs java.lang.string. Was Parameter sind, wie sie übergeben werden und mit welcher Syntax der Zugriff erfolgt folgt im Kapitel 4.4. textfield_example.xml <textfieldexpression class="java.lang.string"> <![CDATA[($P{rechnung}).getTitel()]]> </textfieldexpression> 3.3.2 Grafische Elemente Die Kategorie grafische Elemente beinhaltet Linien, Kreise, Rechtecke und Bilder. Diese Elemente haben ebenfalls Gemeinsamkeiten, die im Element graphicelement zusammengefasst sind. Das Attribut pen steuert den Stil und die Dicke der Umrandung. Mit stretchtype lässt sich das Verhalten steuern, sollten sich in der gleichen Sektion textfield Elemente befinden, dessen Höhe zur Laufzeit dem Inhalt angepasst werden müsste. jasperreport.dtd <!ELEMENT graphicelement EMPTY> <!ATTLIST graphicelement stretchtype (NoStretch RelativeToTallestObject RelativeToBandHeight) #IMPLIED A.Missio, FH-Aargau 25/51

Grafische Elemente pen (None Thin 1Point 2Point 4Point Dotted) #IMPLIED fill (Solid) "Solid"> 3.3.2.1 Linien Die Linie ist ein primitives Objekt. Sie ist durch das Rechteck definiert, welches sie umgibt. Das Attribut direction steuert, ob sie von oben Links nach unten Rechts oder von unten Rechts nach oben Links verlauft. Eine horizontale Linie hat ein Rechteck der Höhe 0, eine vertikale Linie analog dazu eine Breite von 0. Abbildung 11 zeigt zwei Linien, einmal mit dem direction-attribut auf TopDown und einmal auf BottomUp gesetzt. Abbildung 12: Linien 3.3.2.2 Rechtecke Rechtecke erlauben keine dem Element graphicelement ergänzende Einstellungen. 3.3.2.3 Bilder Bilder werden mit dem Element image definiert. Ähnlich zu den dynamischen Textelemente wird der Inhalt zur Laufzeit evaluiert. Dafür ist das Element imageexpression zuständig. jasperreport.dtd <!ELEMENT image (reportelement, graphicelement?, imageexpression?, anchornameexpression?, hyperlinkreferenceexpression?, A.Missio, FH-Aargau 26/51

Grafische Elemente hyperlinkanchorexpression?, hyperlinkpageexpression?)> <!ATTLIST image scaleimage (Clip FillFrame RetainShape) "RetainShape" halign (Left Center Right) "Left" valign (Top Middle Bottom) "Top" isusingcache (true false) "true" evaluationtime (Now Report Page Column Group) "Now" evaluationgroup CDATA #IMPLIED hyperlinktype (None Reference LocalAnchor LocalPage RemoteAnchor RemotePage) "None" > <!ELEMENT imageexpression (#PCDATA)> <!ATTLIST imageexpression class (java.lang.string java.io.file java.net.url java.io.inputstream java.awt.image) "java.lang.string" > Die Abbildung 4 13 verdeutlicht die Anzeige des Bildes mit den verschiedenen Möglichkeiten, die das Attribut scaleimage bietet. Ist es auf RetainShape gesetzt, so wird das Bild skaliert und passend eingefügt, ohne die Proportionen zu verändern. Mit Clip werden die Proportionen ebenfalls belassen, nur auf die Skalierung wird verzichtet. Das Bild wird bei Bedarf abgeschnitten. FillFrame veranlasst eine Anpassung des Bildes an die Dimensionen des image-elements. Abbildung 13: Verschiedene Skalierverhalten Was nicht missachtet werden sollte, ist die Tatsache, dass die Auflösung von Bilder beim Skalieren intern nicht umgerechnet wird. Es empfiehlt sich das Bild in der richtigen Auflösung vorzubereiten. Wer mit HTML Erfahrung gesammelt hat weiss, dass Bilder am besten in ihrer nativen Auflösung zu verwenden sind, und möglichst nicht im HTML-Code skaliert werden sollten. Dieses Paradigma lässt sich hier übertragen. Zu hohe Auflösungen verschlechtern die Performance, indem sie die 4 Aus The JasperReports Ultimate Guide - siehe Quellen A.Missio, FH-Aargau 27/51

Grafische Elemente Grösse des exportierten Dokuments unnötig aufblähen. Zu niedrige Auflösungen wirken sich in Form einer verminderten Anzeigequalität des fertigen Produkt aus. Bilder, die im selben Dokument öfters verwendet werden, lassen sich mit dem Attribut isusingcache während des Füllprozess zwischenspeichern, was die Performance steigert. Die Quelle des Bildes wird in Form eines dieser Objekte angegeben: java.lang.string java.io.file java.net.url java.io.inputstream java.awt.image Das Objekt java.lang.string wird als URL interpretiert. Schlägt dies fehl so wird versucht es als Dateisystempfad zu deuten. Als dritte Möglichkeit wird noch nach einer Ressource im Klassenpfad gesucht. Dies erhöht die Flexibilität des Elements imageexpression. 3.3.3 Hyperlinks In JasperReports lassen sich Textfelder und Bilder mit Hyperlink- und mit Anker- Eigenschaften ausstatten. Hyperlinks können auf ein Anker im selben Dokument oder auf externe Dokumente verweisen. Damit lassen sich Navigationen, Querverweise etc. erstellen. 3.3.4 Element Gruppen Elemente lassen sich gruppieren, indem man sie innerhalb eines elementgroup Elements platziert. Solche Gruppen lassen sich auch verschachteln. Der einzige Vorteil, den man erlangen kann, ist das Steuern des Skalierverhalten von grafischen Elementen. 3.3.5 Subreports Eine der Stärken von JasperReports wird in die Unterstützung von Subreports gesehen. Subreports sind normale Reports, die als Subreports verwendet werden. Ein Report kann sogar auf sich selbst als Subreport verweisen. Die Verschachtelungstiefe ist nicht limitiert. Das Element subreport kann laut DTD in einem Element des Typs band A.Missio, FH-Aargau 28/51

Subreports vorkommen. Dies bedeutet, dass es quasi überall im Report angewendet werden kann, da jede Sektion ein Element des Typs band beinhaltet. jasperreport.dtd <!ELEMENT band (printwhenexpression?, (line rectangle ellipse image statictext textfield subreport elementgroup)*)> Dem Element subreport können die Datenquellen, die ursprünglich dem Report selbst übergeben wurden, weitergeleitet werden. Wir werden auf die Daten- und Parameterübergabe noch weiter eingehen. Subreports erlauben es sehr komplexe Dokumente herzustellen. jasperreport.dtd <!ELEMENT subreport (reportelement, parametersmapexpression?, subreportparameter*, (connectionexpression datasourceexpression)?, subreportexpression?)> <!ATTLIST subreport isusingcache (true false) "true" > 3.4 Daten und Datenübergabe Jedes Reporting Tool definiert ein Mechanismus, um auf Daten aus einem Dataset oder einer ähnlichen Struktur über die Bezeichnung der Felder zugreifen zu können. JasperReports verlangt, dass sämtliche Parameter und Felder namentlich deklarieren werden. Die Daten finden, wie im Kapitel 3.1 kurz angeschnitten, über zwei Wege in das Report: über Parameter oder über eine Datenquelle. Die Abbildung 5 ist diesbezüglich etwas ungenau, da die Parameter nicht dargestellt sind. 3.4.1 Parameter Parameter sind Objektreferenzen, die während des Füllprozess dem JasperFillManager übergeben werden. Sie sind insofern nützlich, wenn JasperReports Daten nicht aus der eigentlichen Datenquelle schöpfen kann. Diese Parameter werden mit A.Missio, FH-Aargau 29/51

Parameter Parameternamen als Schlüssel in einer java.util.map übergeben. Die Parameter müssen wie folgt im Report deklariert werden. rechnung.xml <parameter name="rechnungstitel" class="java.lang.string"> <defaultvalueexpression> <![CDATA[Rechnungstitel fehlt...]]> </defaultvalueexpression> </parameter> <parameter name="rechnung" class="ch.techguys.tobjects.rechnungto"/> <parameter name="referenztext" class="java.lang.string"/> Die Klasse gilt es anzugeben. Eine defaultvalueexpression wird ausgegeben, falls der Parameter in der Map fehlt, was durchaus möglich ist. Auf die Parameter kann von jeder Expression aus mit der Syntax $P{parametername} zugegriffen werden. Analogien mit gewissen Template-Frameworks fallen dem einen oder anderen LeserIn sicher auf. Der JRCompiler ersetzt beim kompilieren der XML Datei den Parameter mit seinem Java-Pendant. Dies ermöglicht zum Beispiel Konstrukte wie: new Integer(($P{rechnung}).getRechnungsnummer()) JasperReports kennt einige vordefinierte Parameter, die sich als nützlich erweisen können: REPORT_PARAMETERS_MAP Zeigt auf die übergebene java.util.map. Kommen Subreports zum Einsatz können Parameter übergeben werden. REPORT_CONNECTION Zeigt auf das java.sql.connection-objekt, falls JasperReports ein solches Objekt übergeben wurde. REPORT_DATASOURCE Wird eine JRDataSource als Datenquelle übergeben, so ist sie über diesen Parameter ansprechbar. REPORT_SCRIPLET A.Missio, FH-Aargau 30/51

Parameter Wird ein Scriptlet benutzt, so wird dieser Parameter drauf zeigen. 3.4.2 Datenquelle Während des Füllprozess iteriert JasperReports über die Datensätze der übergebenen Datenquelle und produziert für jeden Record eine detail-sektion. In der Regel erwartet JasperReports ein JRDataSource Objekt als Datenquelle, wobei alternativ dazu auch eine JDBC Connection übergeben werden kann. Das Objekt JRDataSource wird in den meisten Fällen ein Wrapper-Objekt um ein java.sql.resultset-objekt sein, das JRResultSetDataSource, da sehr oft die Daten aus einer Relationaler Datenbank stammen werden. Es gibt noch weitere Implementierungen dieses Interfaces. Eine weitere ist die JRTableModelDataSource, welche ein javax.swing.table.tablemodel umgibt. Entwickler im EJB-Umfeld werden die JRBeanArrayDataSource und die JRBeanCollectionDataSource zu schätzen wissen. Aus einem als Artikelnummer deklariertes Feld wird JasperReports ein Aufruf der Methode getartikelnummer ausführen. 3.4.3 Felder Die Report Felder sind die einzige Möglichkeit Daten aus der Datenquelle in Expressions zu verwenden. Für jede verwendete Kolonne muss ein field mit name und Datentyp deklariert werden. Felder können nur folgende Datentypen annehmen: java.lang.object java.lang.boolean java.lang.byte java.util.date java.sql.timestamp java.lang.double java.lang.float java.lang.integer java.io.inputstream java.lang.long java.lang.short A.Missio, FH-Aargau 31/51

Felder java.math.bigdecimal Andere Typen müssen als java.lang.objekt übergeben und in der Expression zurückgecastet werden. 3.4.4 Ausdrücke oder Expressions Die Bezeichnung Expression oder auch Ausdruck haben wir schon oft angetroffen. Es bestehen im Report Design mehrere Elemente die Expressions erwarten. Eine Expression ist nichts weiteres als Java Code. Demnach kann überall wo eine Expression stehen muss einfach Java Code geschrieben werden, welches das erwartete Rückgabewert liefert. Die Elemente, die nach einer Expression verlangen sind folgende: variableexpression initialvalueexpression groupexpression printwhenexpression imageexpression textfieldexpression Expressions erlauben den Zugriff auf Parameter, Felder und Variablen mit der folgender einfachen Syntax: $P{ParameterName} $F{FeldName} $V{VariablenName} Ein Ausdruck kann auch etwas komplexer geraten. Hier zwei Beispiele 5 : <textfieldexpression> 5 Aus The JasperReports Ultimate Guide A.Missio, FH-Aargau 32/51

Ausdrücke oder Expressions $F{FirstName} + " " + $F{LastName} + " was hired on " + (new SimpleDateFormat("MM/dd/yyyy")).format($F{HireDate}) + "." </textfieldexpression> <textfieldexpression> $F{FirstName}.substring(0, 1) </textfieldexpression> 3.4.5 Variablen Variablen sind, wie der Name vermuten lässt, Java Variablen, die als Expression einmal deklariert und öfters verwendet werden können. Sie können während des Füllprozess für verschiedene Berechnungen verwendet, initialisiert und zu vordefinierten Zeitpunkte wieder zurückgesetzt werden. jasperreport.dtd <!ELEMENT variable (variableexpression?, initialvalueexpression?)> <!ATTLIST variable name NMTOKEN #REQUIRED class NMTOKEN "java.lang.string" resettype (None Report Page Column Group) "Report" resetgroup CDATA #IMPLIED calculation (Nothing Count Sum Average Lowest Highest StandardDeviation Variance System) "Nothing" incrementerfactoryclass NMTOKEN #IMPLIED > <!ELEMENT variableexpression (#PCDATA)> <!ELEMENT initialvalueexpression (#PCDATA)> Hier ein Beispiel 6 in welches für das Feld Quantity für jede Seite einzeln die Summe berechnet wird. Diese Variable wird nach jeder Seite auf das Initialwert zurückgesetzt. <variable name="quantitysum" class="java.lang.double" resettype="page" calculation="sum"> <variableexpression>$f{quantity}</variableexpression> 6 Aus The JasperReports Ultimate Guide A.Missio, FH-Aargau 33/51

Variablen <initialvalueexpression>new Double(0)</initialValueExpression> </variable> JasperReports hat einige eingebauten Variablen: PAGE_NUMBER Enthält die Aktuelle Seitenzahl. COLUMN_NUMBER Ein Report mit 3 Kolonnen wird auf der zweiten Seite die Kolonnen Nummer 5, 6 und 7 haben. REPORT_COUNT Die Anzahl verarbeitete Datasource-Einträge PAGE_COUNT Die Anzahl Seiten. COLUMN_COUNT Die Anzahl Kolonnen. GroupName_COUNT Für jede deklarierte Gruppe wird automatisch eine Variable angelegt, welche die Anzahl Gruppen mit zählt. 3.5 Requirements Die Installation vom JasperReports Paket setzt weitere Pakete voraus, die ebenfalls als open-source der Allgemeinheit zur Verfügung stehen. JasperReports generiert beispielsweise PDF Dokumente mit Hilfe der itext Library, Excel Sheets mittels POI- Library. Dem Programmierer wird dank einer effektiven Kapselung dieser Interna von den verwendeten Bibliotheken verschont. JasperReports versteckt sie hinter ausgiebigen Façade-Klassen. Ist das JasperReports-Paket von dem Server heruntergeladen, sind bis auf das Java SDK sämtliche benötigten Komponenten enthalten. Es kann gleich losgelegt werden. Die Versionen dieser Komponenten sind nicht die aktuellsten. Aus diesem Grund hier alle nochmals aufgeführt. A.Missio, FH-Aargau 34/51

Requirements Java SDK JDK 1.2.2 oder höher. http://java.sun.com/ XML JAXP 1.1 XML Parser Jakarta Commons Digester Component Jakarta Commons Digester Component (version 1.1 or later) http://jakarta.apache.org/commons/digester/ Jakarta Commons Collections Component Jakarta Commons Collections Component (version 1.0 or later) http://jakarta.apache.org/commons/collections/ Jakarta Commons BeanUtils Component Jakarta Commons BeanUtils Component (version 1.1 or later) http://jakarta.apache.org/commons/beanutils/ Jakarta Commons Logging Component Jakarta Commons Logging Component (version 1.0 or later) http://jakarta.apache.org/commons/logging/ JDBC JDBC 2.0 Driver PDF itext XLS Free Java-PDF library by Bruno Lowagie and Paulo Soares (version 0.96 or later) http://www.lowagie.com/itext/ Jakarta POI Jakarta POI (version 2.0 or later) http://jakarta.apache.org/poi/ A.Missio, FH-Aargau 35/51

Beispiele 4 Beispiele JasperReports bringt Beispiele mit, die in Anschaulichkeit kaum zu übertreffen sind. Einzig ein Beispiel in einem EJB-Container fehlt. Anhand einer Applikation, die sich um Zeiterfassung und Rechnungsstellung kümmert, werden die Teile des Codes vorgestellt, welche die Rechnungen als PDF und XLS ausliefern. In dem zustandslosen Sessionbean MainSession geben 2 Methoden getrechnungpdf und getrechnungxls jeweils ein byte Array mit dem entsprechenden Dokument zurück. MainSession.java byte[] getrechnungpdf(integer id) throws RemoteException, EJBException; byte[] getrechnungxls(integer id) throws RemoteException, EJBException; Die Rechnung wird aus Arbeits- und Materialposten, eine Rechnung und einen Kunden zusammengestellt. Diese Objekte sind Transport-Objekte oder auch Value-Objects, wie sie in EJB Applikationen oft verwendet werden. Methoden wie getverrechnetematerialposten geben eine java.util.collection mit MaterialPostenTO Objekte zurück. MainSessionBean.java public byte[] getrechnungpdf(integer id) { byte[] pdffile = null; Collection posten = this.getalleposten(id); Map parameters = this.getparameterforrechnung(id); try { pdffile = JasperRunManager.runReportToPdf( Config.Jasper.JASPER_FILE_LOCATION, parameters, new JRBeanCollectionDataSource(posten)); if (Config.DEBUG) System.err.println("-getRechnungPdf- pdf: " + pdffile); } catch (JRException e) { e.printstacktrace(); } return pdffile; } public byte[] getrechnungxls(integer id) { byte[] xlsfile = null; JasperPrint jrprint = null; Collection posten = this.getalleposten(id); Map parameters = this.getparameterforrechnung(id); A.Missio, FH-Aargau 36/51

Beispiele ByteArrayOutputStream out = new ByteArrayOutputStream(); try { jrprint = JasperFillManager.fillReport( Config.Jasper.JASPER_FILE_LOCATION, parameters, new JRBeanCollectionDataSource(posten)); JRXlsExporter exporter = new JRXlsExporter(); exporter.setparameter(jrexporterparameter.jasper_print, jrprint); exporter.setparameter(jrexporterparameter.output_stream, out); exporter.setparameter (JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE); exporter.exportreport(); xlsfile = out.tobytearray(); if (Config.DEBUG) System.err.println("-getRechnungXls- xls: " + xlsfile); } catch (JRException e) { e.printstacktrace(); } return xlsfile; } private Map getparameterforrechnung(integer id) { Map parameter = new HashMap(); parameter.put("rechnung", this.getrechnung(id)); parameter.put("kunde", this.getkundevonrechnung(id)); return parameter; } private Collection getalleposten(integer id) { Collection posten = this.getverrechnetearbeitsposten(id); posten.addall(this.getverrechnetematerialposten(id)); return posten; } Diese beiden Methoden werden vom Servlet MainServlet aufgerufen. Es gibt die Dokumente, nachdem es im Header den entsprechenden Typ application/pdf oder application/msexcel gesetzt hat, dem Browser weiter. MainServlet.java if (cmd.equals("pdf")) { byte[] pdffile = null; pdffile = mainsession.getrechnungpdf(id); if (pdffile!= null && pdffile.length > 0) { response.setcontenttype("application/pdf"); A.Missio, FH-Aargau 37/51

Beispiele response.setcontentlength(pdffile.length); ServletOutputStream ouputstream = response.getoutputstream(); ouputstream.write(pdffile, 0, pdffile.length); ouputstream.flush(); ouputstream.close(); } } else if (cmd.equals("xls")) { byte[] xlsfile = null; xlsfile = mainsession.getrechnungxls(id); if (xlsfile!= null && xlsfile.length > 0) { response.setcontenttype("application/msexcel"); response.setcontentlength(xlsfile.length); ServletOutputStream ouputstream = response.getoutputstream(); ouputstream.write(xlsfile, 0, xlsfile.length); ouputstream.flush(); ouputstream.close(); } } A.Missio, FH-Aargau 38/51

ireport 5 ireport Der proportional grösste Aufwand liegt in der Gestaltung des Xml-Reports. Die programmatische Implementierung von Füll- und Exportprozess beschränkt sich im Extremfall auf eine Java-Codezeile. Um den gestalterischen Aufwand in Designprozess zu minimieren, eignet sich das Werkzeug ireport hervorragend. Es erhöht die Produktivität im Gestaltungs- und Entwicklungsprozess des Reports unheimlich. Der Entwickler muss sich, zumindest nicht am Anfang schon, mit der Syntax von JasperReports auseinandersetzen. ireport wird als open-source Projekt auf SourceForge gehostet. Es ist wie JasperReports in Java geschrieben, und es beschränkt sich nicht nur auf die Gestaltung. Der Kompilations- und Exportprozess kann ebenfalls aus diesem Programm heraus gestartet werden. Abbildung 14: ireport Bis auf das Element elementgroup lassen sich sämtliche JasperReports-Tags damit editieren. Das grafische Interface ist intuitiv. Es erleichtert den Einstieg in die Welt von A.Missio, FH-Aargau 39/51

ireport JasperReports. Abbildung 15: ireport 6 Quellen The JasperReports Ultimate Guide Version 1.0 2002 Teodor Danciu Reporting Tool in ambiente Open Source 2003 Giulio Toffoli JasperReports Homepage http://jasperreports.sourceforge.net/ ireport Homepage http://ireport.sourceforge.net/ A.Missio, FH-Aargau 40/51

Anhang 7 Anhang 7.1 Rechnungs-XML-Datei <?xml version="1.0" encoding="utf-8"?> <!-- Created with ireport - A designer for JasperReports --> <!DOCTYPE jasperreport PUBLIC "//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd"> <jasperreport name="rechnung001" columncount="1" printorder="vertical" orientation="portrait" pagewidth="595" pageheight="842" columnwidth="451" columnspacing="0" leftmargin="72" rightmargin="72" topmargin="28" bottommargin="42" whennodatatype="nopages" istitlenewpage="false" issummarynewpage="false"> <parameter name="rechnungstitel" isforprompting="true" class="java.lang.string"/> <parameter name="rechnung" isforprompting="false" class="ch.techguys.tobjects.rechnungto"/> <parameter name="kunde" isforprompting="false" class="ch.techguys.tobjects.kundeto"/> <parameter name="referenztext" isforprompting="false" class="java.lang.string"/> <field name="postenbeschreibung" class="java.lang.string"> <fielddescription> <![CDATA[Ausführliche Zusammengesetzte Beschreibung des Posten]]> </fielddescription> </field> <field name="id" class="java.lang.integer"> <fielddescription><![cdata[nummer des Posten]]></fieldDescription> </field> <field name="anzahl" class="java.lang.double"> <fielddescription><![cdata[anzahl Stunden oder Artikel]]> </fielddescription> </field> <field name="betrag" class="java.lang.double"> <fielddescription><![cdata[berechneter Betrag des Posten]]> </fielddescription> </field> <field name="preis" class="java.lang.double"> <fielddescription><![cdata[preis des Artikels bzw Stundenansatz]]> </fielddescription> </field> <variable name="betrag_sum" class="java.lang.double" resettype="report" calculation="sum"> <variableexpression><![cdata[$f{betrag}]]></variableexpression> <initialvalueexpression><![cdata[new Double(0)]]> </initialvalueexpression> </variable> A.Missio, FH-Aargau 41/51