Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ich möchte eines meiner kleinen Programme gerne um eine Funktion erweitern, und zwar gibt mir das Prog 2 Listen aus, die ich davor in ner jTable einlese, aber das ist ja egal, ich kann die Daten aufbereiten wie es zum Drucken am besten ist..
Es geht darum, dass beide Listen die gedruckt werden sollen einmal ganz oben ein bild bekommen (Logo, s/w) drunter zuerst ein eingerahmtes Feld mit Text und darunter Zeilenweise die Datensätze in mehreren Spalten..
Also am Besten wäre was rel. universelles das ich mit Strings oder StringBuildern oder String Arrays futtern kann oder so..
Wie siehts da aus, ich hab schon bisschen was gelesen, und wie ich das sehe ist Drucken in Java eher schlecht ausgebaut oder irre ich mich da?
Das ist definitiv mehr als eine kleine Tabelle drucken, denn dafür würde ein table.print() reichen.
Natürlich kannst du auch dein Panel in ein BufferedImage malen und dieses zum Schluss drucken. Meiner Erfahrung nach, ist das aber sehr änderungsresistent und mit viel falschen Testausdrücken verbunden, bis es wirklich passt.
Was du möchtest, nenne ich, wenn auch klein, einen Report.
Da rate ich immer zu JasperReports. Es gibt dazu das Tool iReport mit dem du den Report (Logo, etwas Text) und deine Tablezeilen designen kannst.
Vorteil ist, dass du extrem flexibel bist, weil dein Code nichts davon weiss, WIE der Output wirklich aussieht. Beispielsweise kannst du den Report somit auf dem Schirm, auf dem Drucker oder in PDF erstellen lassen.
Nachteil ist, das du dich erst in Jasperreports einarbeiten musst. Jedenfalls füllst du deinen Report, indem du den Feldern im Report, Werte zuweist, beispielsweise die Logo-Bilddatei etc.
Ich füge mal ein kleines Beispiel an. In dem Report wird ein Logo und die aktuelle Uhrzeit (eingerahmt) gezeigt. Von iReport kommt die Definitionsdatei mit Endung jrxml. Diese wird dann in eine .jasper Datei kompiliert. Und anschliessend werden alle Parameter mit Werten gesetzt. Im Beispiel wird es im JFrame gezeigt (JRViewer). Daraus kann gedruckt werden, oder man macht dieses direkt.
Ich hab jetzt mal deinen Code getestet, und wollte mich damit spielen..
Das Jasper Library hab ich heruntergeladen und das Prog, also iReport auch..
Wenn ich deinen Code testen will wirft er mir folgenden Fehler: java.lang.NoClassDefFoundError: org/apache/commons/digester/Digester
Was mach ich falsch?
Irgend eine Klasse fehlt offenbar, nur welche?
Ich tippe mal auf org/apache/commons/digester/Digester:lol:
Im Ernst...
Ich muss dich auf heute abend vertrösten, da ich gerade keinen Zugang zu meinem Rechner habe. Und da ich mit JasperReports seit Ewigkeiten nichts mehr gemacht habe...
Die Libs von JasperReports musst du nämlich auch noch hinzufügen und das waren echt viele.
Und da ich keine Lust hatte, rauszusuchen, welche notwendig sind, habe ich alle genommen.
Ich meine es waren ca. 96 aus dem Lib-Verzeichnis und jasperreports-5.6.0.jar aus dem dist-Ordner. org/apache/commons/digester/Digest beispielsweise ist in lib/commons-digester-2.1.jar.
Vielleicht hilft das weiter, ansonsten wie gesagt heute abend mehr Infos.
Ok, ich hab jetzt alle Libraries importiert die er benötigt hat, jetzt gehts, nur erscheint der Inhalt nicht den du einfügst, beim Bild hab ich nen anderen Pfad genommen, aber auch den Rest schreibt der report nicht rein...
Es erscheint der Frame und nichts ist drinnen..???:L
Weiterhin muss der Parameter in der XML-Datei stimmen.
[XML]<parameter name="logo" class="java.io.InputStream"/>[/XML]
Kontrollier bitte ob das bei dir stimmt.
Ok, ich komm jetzt zumindest grundlegend mit den Reports klar, und wie das aussieht ist das noch garnicht mal schwer, da ich theoretisch einfach eine Hilfsklasse baue in die ich meine 3 Elemente übergebe (Bild, Tabelle und Text) und die Hilfsklasse packt das in eine Jasper vorlage und druckt..
So nun meine weiteren Fragen die ich selber nicht lösen konnte bisher..
1.Wie bringe ich eine Tabelle auf Java in den Report? Ich habs mid der Tabelle aus der iReport palette probiert aber da kann ich den Code nicht so hinbiegen wie bei dem Textfeld und dem Bild...
2.Kann man das so machen, dass das Vorschaufenster das dann erscheint irgendwie im Windows look ist und von meinem Prog das Logo übernimmt oder wird das von jasper gesteuert?
Sorry für die späte Antwort, habe aber extrem viel zu tun😎
Was du möchtest, kann "einfach" mit einer JRBeanCollectionDataSource gemacht werden. So werden Collections-Beans als Datenlieferanten mit Jasper verbunden. Eine kleine Beschreibung dazu findest du hier.
Das habe ich mal in meinem Beispiel angewendet. Du musst darauf achten, das die Collection-Daten im Detail-Band enthalten sind (da für alle Items) und die Uhrzeit im Page-Header (da nur einmal). XML und Screenshot im Anhang.
Java:
public class Jasper extends JPanel {
private JRViewer jv;
public Jasper() throws JRException, PrinterException {
setLayout(new BorderLayout());
String jrxmlFileName = "src/turtleReport.jrxml";
JasperDesign jasperDesign = JRXmlLoader.load(jrxmlFileName);
JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
Map<String, Object> map = new HashMap<>();
InputStream imgInputStream = this.getClass().getResourceAsStream("/images/tomcat.png");
map.put("logo", imgInputStream);
map.put("uhrzeit", new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(new Date()));
Collection<JapserPerson> data = new ArrayList<JapserPerson>();
data.add(new JapserPerson("turtle"));
data.add(new JapserPerson("Merkel"));
JRDataSource datasource = new JRBeanCollectionDataSource(data, true);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, map, datasource);
jv = new JRViewer(jasperPrint);
add(jv, BorderLayout.CENTER);
}
public static void main(String[] args) throws JRException, PrinterException {
JFrame frame = new JFrame("Turtle-Report");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new Jasper());
frame.setSize(700, 700);
frame.setVisible(true);
}
}
Ok, danke, das hilft mir schonmal ein Stück weiter..
Aber die große Frage ist immer noch ob das so auch mit einem ganzen JTable oder dem entsprechenden Table Model geht?
Wie gesagt, ich hab einen ausgefüllten JTable aus einem anderen Frame der übergeben und gedruckt werden soll, ich kann die Daten daraus gerne anders aufbereiten, aber im Endeffekt soll eine Tabelle mit 5od6 Spalten und ca. 20 Zeilen auf dem fertigen Report erscheinen..
Das wäre das wichtigte eig., der Rest ist mehr oder weniger Kosmetik..
Aber Danke schonmal, das Jasper Library sieht nach ner guten Lösung aus wenn man es beherrscht😀
Einmal kannst du deine Daten umpacken, damit es gut mit Jasper zusammenpasst. Das habe ich gemacht und Ergebnis siehst du im Screenshot.
Du kannst aber auch direkt dein TabelModel verwenden, denn bei JRBeanCollectionDataSource muss "es nur" eine Bean sein.
Du musst "lediglich" für alle Daten im Model entsprechende getter/setter haben, damit du in iReport das Feld definieren kannst und darüber der entsprechende getter-Aufruf in deiner Bean erfolgt.
Achso, ja ok, wenn ich das TableModel auch als Source hernehmen kann ist das in Ordnung..
Ich habe mich evtl. falsch ausgedrückt, da ich die Daten wie gesagt unteschiedlich aufbereiten kann, das ich kein Thema, nur will ich dann schon eine Tabelle gedruck haben, also mit den Linien, Header etc...
Hatte aber extrem viel zu arbeiten und zweitens musste ich erst probieren, wie Tabellen in Jasper noch mal funktionieren.
Habe aber nun ein Beispiel fertig gemacht und poste es hiermit.😉
Wie auch bei den anderen Beispielen ist die "Zauberklasse" JRBeanCollectionDataSource.
Beim Füllen des Reports gibst du eine Methode an, die dir eine JRDataSource, in diesem Fall eine JRBeanCollectionDataSource, bereitstellt.
Diese wird von Jasper für die Daten "befragt" welche Daten denn in der Tabelle stehen sollen. In diesem einfachen Beispiel sind es die Städte 0 bis 10. In iReport habe ich noch einen statischen Text im Table-Header und im Column-Header angegeben, damit die Tabelle "schöner" aussieht.