www.alexander-merz.com | Alexander Merz

JasperReports Einführung Teil 5 - Die Ausgabeformat

Neben den bereits gezeigten Ausgabeformaten PDF und HTML enthält die JasperReports-Bibliothek Klassen zum Erzeugen von CSV, Excel, XML, RTF und einfachen Text. In diesem Teil nehmen wir die Ausgabe-Klassen genauer unter die Lupe.

Die Quelltexte der Java-Klassen, der XML-Dateien und der SQL-Skripte finden sich unter www.alexander-merz.com/jr-examples.zip.

In den bisherigen Beispielen speicherten wir den erzeugten Bericht über die Methode JasperExportManager.exportReportToPdfFile() als PDF-Datei. Um den Bericht als HTML auszugeben, können wir exportReportToHtmlFile() verwenden. Wer vermutet, analoge Methoden existieren für die anderen Formate ebenfalls, liegt falsch. Stattdessen müssen wir explizit ein Objekt einer entsprechenden Ausgabe-Klasse erzeugen. Wir können diesen Weg auch für PDF und HTML nutzen, sie bilden keine Ausnahme - außer dass aus praktischen Gründen die beiden obigen Methoden existieren, um diesen Vorgang zu vereinfachen. Allerdings entgehen uns dadurch auch die Möglichkeiten die HTML- bzw. PDF-Ausgabe besser anzupassen.

Zu diesem Artikel gibt es nur ein Beispiel: Example15.java. Es gibt einen etwas aufwendiger gestalten Bericht in den verfügbaren Formaten aus. Neben den eigentlichen Daten enthält er verschieden positionierte, statische Textblöcke mit Adressangaben. Auf diese Weise kann man die Genauigkeit der Umsetzung in den verschiedenen Ausgabeformaten verfolgen.

JRAbstractExporter

Alle Ausgabe-Klassen sind von net.sf.jasperreports.engine.JRAbstractExporter abgeleitet. Das Vorgehen, um einen kompilierten und gefüllten Bericht auszugeben, ist weitgehend unabhängig vom Ausgabeformat. Das Grundgerüst:

JRExporter exporter = new JRPdfExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(..., ...);
exporter.exportReport();

In der ersten Zeile wird ein neues Objekt der Ausgabeklasse erzeugt, hier für die PDF-Ausgabe. Als nächstes werden einige Parameter gesetzt, und zum Schluss die eigentliche Ausgabe mit exportReport() erzeugt.

Dreh- und Angelpunkt zur Anpassung der Ausgabe und zur Beeinflussung des Vorganges ist die setParameter()-Methode. Sie erwartet als erstes Argument den Namen eines Parameters und als zweiten den Wert der Parameter. Für den Namen des Parameter gibt es zwei Quellen: entweder allgemeine Konstanten definiert in der Klasse net.sf.jasperreports.engine.JRExporterParameter, oder ausgabe-spezifische Konstanten in den spezifischen Klassen, ihr jeweiliger Name entspricht dem Namen der Ausgabe-Klasse mit angehängtem Parameter. Der Datentyp des jeweiligen Parameterwertes ist abhängig vom Parameter.

In unserem Beispiel setzen wir unabhängig von der Ausgabe immer zwei Parameter:

exporter.setParameter(JRExporterParameter.JASPER_PRINT,
                      jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME,
                      "output/Example 15.pdf");

Zuerst wird der auszugebende Bericht übergeben, im zweiten der Name der Datei, in welcher der Bericht gespeichert werden soll. Würden wir statt OUTPUT_FILE_NAME den Parameter OUTPUT_STREAM verwenden, dann erhalten wir keine Datei, sondern es wird ein Stream mit dem erzeugten Report im jeweiligen Ausgabeformat bereitgestellt.

In den nachfolgenden Abschnitten stellen wir die Ausgabeformate genauer vor.

PDF

Die Erzeugung des PDF-Formates übernimmt die Klasse net.sf.jasperreports.engine.export.JRPdfExporter. Über Parameter kann unter anderem bestimmt werden, welche PDF-Version verwendet wird, es können Meta-Daten oder ein Passwort gesetzt werden. Im Beispiel wird ein Passwort für das Dokument bestimmt:

exporter.setParameter(JRPdfExporterParameter.IS_ENCRYPTED,
                      new Boolean(true));
exporter.setParameter(JRPdfExporterParameter.USER_PASSWORD,
                      "secret");

HTML

Verantwortlich für die HTML-Ausgabe ist die Klasse net.sf.jasperreports.engine.export.JRHtmlExporter. Sie erzeugt eine einzelne HTML-Seite, die optisch in einzelne Teil-Abschnitte (Seiten im Bericht) zerteilt wird. Die dazugehörigen Parameter beeinflussen insbesondere den HTML-Code zwischen diesen einzelnen Abschnitten, und erlauben die Konfiguration der URL und des Speicherortes für enthaltene Bilder. Weiterhin kann der Einleitungs- und Abschlussteil des HTMLs geändert werden.

Eine weitergehende Anpassung des HTML-Codes ist leider nicht möglich, lediglich über CSS kann die Darstellung allgemein beeinflusst werden.

XML

Die Klasse net.sf.jasperreports.engine.export.JRXmlExporter produziert eine XML-Datei. Das Format der XML-Datei entspricht der XML-Vorlage des Reports. Mit dem Unterschied, dass alle Platzhalter für Felder, Parameter usw. durch die konkreten Werte ersetzt wurden. Da sämtlichen XML-Tags und Attribute der originalen Vorlage erhalten bleiben, kann die XML-Ausgabe mittels XSTL z.B. in XML-FO ("Formating Objects") umgewandelt werden.

Es existieren nur zwei spezielle Parameter, einmal kann der Ort der DTD angepasst werden; und sie können entscheiden, ob vorhandene Bilder im XML direkt oder als Datei abgelegt werden.

Excel (XLS)

Die Klasse net.sf.jasperreports.engine.export.JRXlsExporter übersetzt die einzelnen Bestandteile des Berichtes in Zellen eines Excel-Dokumentes. Sie können entscheiden, ob die Ausgabe in einem einzelnen Worksheet erfolgen soll, oder für jede Seite des Berichts ein Worksheet erzeugt wird. Weitere Parameter betreffen u. a. die Erkennung des Zell-Datentyps und die Bezeichnungen für die Worksheets.

Text

Bei der Ausgabe des Berichtes als "Plain-Old"-Text können zwar die meisten grafischen Elemente verloren gehen, trotzdem bleibt mit den richtigen Einstellungen das Layout recht gut erhalten. Die verantwortliche Klasse ist net.sf.jasperreports.engine.export.JRTextExporter

Sie haben zwei Schrauben, an denen Sie drehen können: einerseits den Umrechnungsfaktor von Pixel zu Zeichengröße (CHARACTER_*) und andererseits die Seitengröße in Zeichen (PAGE_*).

Im Beispiel definieren wir eine maximale Seitenbreite von 79 Zeichen pro Zeile und ein Zeichen soll 12 Pixel hoch sein.

exporter.setParameter(JRTextExporterParameter.PAGE_WIDTH,
                      new Integer(79));
exporter.setParameter(JRTextExporterParameter.CHARACTER_HEIGHT,
                      new Integer(12));
12 Pixel deshalb, weil dies die übliche Schriftgröße in der Vorlage ist. Kleinere Werte könnten dazu führen, dass Textteile im Bericht abgeschnitten werden.



RTF

Das Rich-Text-Format, welches die Klasse net.sf.jasperreports.engine.export.JRRtfExporter erzeugt, ist ein weitgehend hersteller-unabhängiges Format für Text-Dokumente. Im Gegensatz zu den anderen Klassen unterstützt diese Klasse keine ausgabe-spezifische Parameter.

CSV

Das Format für "Comma Separated Values" wird nicht nur als Eingabe-Format, sondern auch als Ausgabe-Format unterstützt. Allerdings ist die Implementierung in net.sf.jasperreports.engine.export.JRCsvExporter etwas ungewöhnlich: Es wird der vollständige Report einschließlich der statischen Textblöcke ausgegeben. Damit kann das erzeugte CSV nur sehr schwierig wieder als Datenquelle verwendet werden. Die Ausgabe entspricht eher einem unformatierten Excel-Dokument.

Als Parameter muss angegeben werden, welches Zeichen als Daten-Trennzeichen fungieren soll, und was das Zeilenende markiert.

JasperReports-Einführung Teil 1
JasperReports-Einführung Teil 2 – Abschnitte und Größenangaben
JasperReports-Einführung Teil 3 - Texte und Schriften
JasperReports Einführung Teil 4 - Die Datenquellen
JasperReports Einführung Teil 5 - Die Ausgabeformat