Arraylist eigener Klasse an iReport übergeben

dogano

Mitglied
Hallo Zusammen,

ich möchte einen Report mit iReport (JasperReports) generieren, der eine ArrayList eigener Klasse als Datenquelle haben soll (also keine Datenbank/kein SELECT).

Die eigene Klasse ist eine typische Objektbeschreibung mit GET- und SET-Methoden.

Der Code für den Report sieht wie folgt aus:

Java:
	try {
			jasperReport = JasperCompileManager.compileReport(source);
			jasperPrint = JasperFillManager.fillReport(jasperReport,
					jasperParameter, new JRBeanCollectionDataSource(list));
				JasperExportManager.exportReportToPdfFile(jasperPrint,
						exportPath);
		} catch (JRException e) {
			e.printStackTrace();
			success = false;
		}

Jetzt muss ich meinem Report aber irgendwie mitteilen dass er die ArrayList "meiner" Klasse benutzen soll. Hier komme ich nicht mehr weiter. Könnt ihr mir behilflich sein?

Liebe Grüße,

dogano
 
Idee schon, habe aber gerade kein Beispiel (mehr) zur Hand.

Ich meine mich zu erinnern, das ich immer die Daten für einen Report per
Java:
JasperFillManager.fillReport(Map<String, Object> model)
übergeben habe. Leider kann ich nicht mehr beisteuern, sorry😳
 
hey, vielen Dank.
Ich glaube ich muss meine Frage etwas präzisieren: Es geht mir darum, dass auf iReport Seite ja meine Klasse bekannt sein muss, wenn ich eine ArrayList als Datenquelle übergebe. Meine Frage ist wie ich das anrichte?

Liebe Grüße,

dogano
 
Exportiere dein Projekt in eine JAR-Klasse und füge sie zum Classpath von IReport hinzu.
(Extras - Optionen - iReport - Tab General - Reiter Classpath)

Dann kannst du als Expression eine Methode verwenden, die diese Liste erzeugt und verwendet.
Also Text Field Expression könnte sein:

Java:
org.example.ListFactory.createList($P{meinParameter}).toString()

Wobei meinParameter ein Parameter im Report ist.

Ist das richtig oder willst du die Liste anders verwenden?
 
Exportiere dein Projekt in eine JAR-Klasse und füge sie zum Classpath von IReport hinzu.
(Extras - Optionen - iReport - Tab General - Reiter Classpath)

Dann kannst du als Expression eine Methode verwenden, die diese Liste erzeugt und verwendet.
Also Text Field Expression könnte sein:

Java:
org.example.ListFactory.createList($P{meinParameter}).toString()

Wobei meinParameter ein Parameter im Report ist.

Ist das richtig oder willst du die Liste anders verwenden?

Hey,

vielen Dank für die Info. Mein Projekt ist allerdings ein RCP/SWT Projekt (also keine JAR). Kann ich nicht einfach die Klasse einbinden?

Nachdem ich dem Report meine Klasse mitgeteilt habe, würde ich gerne mithilfe den Gettern die Werte als Parameter/Felder übergeben, damit gruppiert auf dem Report ausgegeben werden.

Ist es also möglich die ArrayList im Designer dann zu verwenden?
 
Zuletzt bearbeitet:
Auch wenn dein Projekt ein RCP Projekt ist, kann es in eine Jar exportiert werden.

Statische Methoden kannst du so wie ich es oben beschrieben habe immer verwenden.
Es muss nur die Klasse eben irgendwo im Classpath zu finden sein.

Für Tests im Designer musst du eben die Jar hinzufügen.
Später zur Laufzeit ist diese Klasse eh im Classpath vorhanden.

Willst du dynamisch Werte von bestimmten Objekten übergeben, solltest du dies wie turtle beschrieben hat über die ParameterMap machen.
Der Key muss der Name des Parameters im Report sein.
Der Value ist dann der Wert. (Dieser muss natürlich den richtigen Datentyp definiert haben. z.B. java.lang.String)
 
Hi,

dass man SWT auch in JARs exportieren kann, war mir neu 🙂 Vielen Dank für die Info...

ich habe jetzt das Problem gelöst. Ist eigentlich ganz einfach, wenn man weiß wie.

Ich habe ein extra Java Programm erstellt und die Model Klassen dahin kopiert. Dieses Projekt habe ich dann (wichtig ist nicht "Runnable JAR", sondern "JAR Archive" auszuwählen) exportiert und unter Optionen -> Extras -> Classpath in iReport eingebunden.

Als nächstes habe ich für meinen Report als Datenquelle "JavaBean Datasource" ausgewählt und den Namen (zusammen mit dem Package) angegeben (z.B. de.java.forum.Person). Weil die JAR ja eingebunden war, kann man einfach "Read Attributes" sagen und der Report kennt die Felder.

Später bei Programmaufruf muss man lediglich folgendes machen:

Java:
jasperReport = JasperCompileManager.compileReport(source);
jasperPrint = JasperFillManager.fillReport(jasperReport, jasperParameter, new JRBeanCollectionDataSource(list));

wobei list eine ArrayList der Klasse, die iReport kennt, und source der Pfad zum Report ist.

Vielen Dank für eure Hilfe!

dogano
 
Zuletzt bearbeitet:

Zurück
Oben