Gehen wir zum Thema und stellen Sie die heutigen Jasperreport, Ireport oder Jasperstudio vor, und zwei sind seine Visualisierungstools.
Was ist Jasperreport?
Dieses Produkt hat tatsächlich viele inländische Benutzer. Es ist ein fremdes Produkt, und es kann gesagt werden, dass es im Bereich Java Reporting häufig verwendet wird.
Als ich mit diesem Bericht zum ersten Mal in Kontakt kam, hat es mir sehr gut gefallen. Das Wichtigste ist sein Visualisierungsinstrument, das mich wirklich nicht aufhalten lässt. Ich könnte tatsächlich Java -Berichte entwerfen, indem ich einfach Bilder zeichne. Apropos Zeichnen, wir können visuelle Tools verwenden, um Berichtsvorlagen visuell zu entwerfen, und die von ihnen unterstützten Dateiformate sind sehr breit, einschließlich Excel, Word, PDF, HTML, XML, CSV usw.
Sieht es nicht sehr mächtig aus? Es ist zu einer Zeit entworfen und mehrmals wiederverwendet. Natürlich haben mächtige Dinge oft zwei Seiten. Ich bin darauf gestoßen und habe mich lange gefoltert. Ich werde es später ausführlich beschreiben.
Jasperreports große Brüste
Ich sagte früher, dass Jasperreport oder Ireport oder Jasperstudio tatsächlich ungenau sind. Der zweite Bruder Ireport und der dritte Bruder Jasperstudio sind tatsächlich Jaspers Hilfswerkzeuge für visuelle Design. Sie können Jasper -Berichte entwerfen, ohne sie zu verwenden, und mehr XML -Weiße schreiben. Vor 5.5 wurde dieses Tool Ireport genannt. Nach 5.5 wurde Ireport mit der Geburt meines dritten Bruders Jasperstudio vollständig ersetzt. Tatsächlich sind diese beiden Werkzeuge im Grunde die gleichen Einkind-Landsleute.
Spezifischer Workflow:
①First erhält Jasper die XML -Datei der Formatinformationen, die ausgegeben werden müssen, und kompilieren dann eine .jasper -Type aus der XML -Datei. Anschließend kann diese Jasper -Datei in unserer Anwendung geladen werden, um den Abschlussbericht zu generieren. Hast du ein sehr vertrautes Gefühl? Ja, das ist Java sehr ähnlich und muss zusammengestellt werden.
Das folgende Bild zeigt die Ireport -Operation -Schnittstelle. Es ist ähnlich wie Jasperstudio, also werde ich es nicht veröffentlichen. Sie können es selbst auf Baidu herunterladen.
Lassen Sie mich kurz jede Art von Band in das Bild oben einführen.
(1) Titelband: Das Titelsegment wird nur im oberen Teil der ersten Seite des gesamten Berichts angezeigt. Mit Ausnahme der ersten Seite wird der Inhalt der Titelband nicht mehr angezeigt, unabhängig davon, wie viele Seiten im Bericht enthalten sind.
(2) PageHeader -Band: Wie der Name schon sagt, wird der Inhalt im PageHeader -Segment in jeder Seite im gesamten Bericht angezeigt und oben auf der Seite angezeigt. Wenn es sich um die erste Seite des Berichts handelt, wird der Inhalt im PageHeader unter der Titelband angezeigt. Auf allen anderen Seiten mit Ausnahme der ersten Seite wird der Inhalt im PageHeader oben auf der Seite angezeigt.
(3) PageFoter -Band: Am unteren Ende der Seite angezeigt.
(4) LastPageFoter -Band: Am Ende der letzten Seite angezeigt.
(5) Detailband: Inhaltssegment, Inhalte, die im Entwurfsbericht in diesem Band wiederholt werden müssen, und der Inhalt im Detailsegment wird auf jeder Seite angezeigt.
(6) Columnheader Band: Für das Header -Segment des Detailbandes wird in diesem Segment im Allgemeinen der Header des Berichts gezogen.
(7) Columnfoterband: Für das Ende der Tabelle der Detailbande.
(8) Zusammenfassungsband: Das Gesamtsegment der Tabelle wird nach dem Detailband auf der letzten Seite des gesamten Berichts angezeigt. Es wird im Allgemeinen verwendet, um den Gesamtwert von einem oder mehreren Feldern im Bericht zu zählen.
Das obige sind alle Visualisierungstools. Tatsächlich ist es sehr einfach zu bedienen. Sie können es finden, indem Sie es erforschen. Da es sich um eine echte Aufzeichnung der Grube handelt, ist dies natürlich nicht der Punkt, also werde ich nicht darüber sprechen.
Anwendungen im Code
Dies sind die Schritte, die ich zusammengefasst habe. Vielleicht ist die Beschreibung nicht sehr genau. Bitte mach es.
①Design -Vorlagen, generieren Sie JRXML -Dateien, ↑↑ Das obige Visualisierungstool entwirft die Vorlagenstile, die Sie benötigen
② Compile Templates, Jrxml wird in Jasper -Dateien zusammengestellt, genau wie .Java- und .class -Dateien in Java, das Programm muss die Binärdatei von *.jasper ausführen.
Tatsächlich kann dieser Schritt direkt mit Ireport zusammengestellt werden, um .jasper zu generieren, und natürlich kann er zur Laufzeit auch über das Jasper -Programm zusammengestellt werden. Es wird jedoch empfohlen, dass die Jasper -Version, wenn sie im Programm zusammengestellt ist, am besten mit der Ireport- oder Jasperstudio -Version übereinstimmt.
③Ecute Report (Daten werden in den Bericht ausgefüllt)
1. Laden Sie die Vorlage, um ein Jasperreport -Objekt zu erzeugen
2. Verwenden Sie Jasperfillmanager, um Jasperprint -Objekt zu generieren
Verwenden Sie ④Final JrxlsxExporter, um den Bericht zu exportieren oder anzeigen
Ladevorlagen
Da wir .Jasper oder .jrxml -Dateien mithilfe von Visualisierungstools generiert haben, müssen wir das Programm natürlich laden lassen.
Geladener Code, das Objekt des Jasperport zurückgeben
if (urlpath.endswith (". Jrxml")) {// Jrxml zu Jasper Try {InputStream is = url.openstream () kompilieren; Jasperreport = JasperCompilemanager.comPilereport (IS); } catch (ioException e) {neue Baseexception werfen ("Jasper -Fehler laden", e); } catch (jrexception e) {neue Baseexception werfen ("Die JRXML -Vorlage Transformation in Jasper -Dateifehler", e); } catch (throwable e) {neue Baseexception werfen ("Die JRXML -Vorlage transformiert zu Jasper -Dateifehler", e); } catch (throwable e) {log.Error (e); Neue Baseexception werfen (E.getMessage ()); }} else if (urlpath.endswith (". Jasper")) {try {InputStream is = url.openstream (); JasperReport = (JasperReport) Jrloader.loadObject (IS); } catch (ioException e) {neue Baseexception werfen ("Jasper -Fehler laden", e); } catch (jrexception e) {throw New Baseexception ("Die JRXML -Vorlagendateifehler", e); } catch (throwable e) {log.Error (e); Neue Baseexception werfen (E.getMessage ()); }} else {town baseexception ("Ungültige Datei!"); }Holen Sie sich die Datenquelle im Bericht
Hier benutze ich JavaBean, um es zu bekommen
JrdataSource DataSource = null; if (fieldValues! } else {dataSource = new JRempptyDataSource (); } Fieldvalues ist die Sammlung von Pojos, die in der Datenbank erhalten wurden.
Berichtsfüllung durchführen
Holen Sie sich das Jasperprint -Objekt
Map <string, object> parameterervalue = new HashMap <String, Object> (); Jasperprint = JasperFillManager.FillReport (Jasperreport, Parameterervalue, DataSource);
Schließlich verwenden wir Jrxlsxexporter, um den Bericht zu exportieren
Dies ist auch der Ort, an dem die meisten Konfigurationsparameter erforderlich sind
baos = new bytearrayoutputStream (); exporter = new jrxlsxexporter (); exporter.setParameter (jrexporterParameter.jasper_print, Jasperprint); exporter.setParameter (jrexporterparameter.output_stream, baos);
exporter.exporTreport ();
Abgeschlossen wurden die Daten in den Ausgangsstrom geschrieben. Sie entscheiden, wie man es selbst ausgibt, ist es viel kurzer als andere Methoden der Code -Einführung.
In der Tat hat JasperReport einen unvergleichlichen Vorteil beim Codesschreiben, und verschiedene APIs wurden verpackt. Aber es mag sein, dass Chacha zu viel getan hat und es viele Probleme gibt.
Jasperreports Problem
1. Der leere Speicherplatz vor zwei Reihen
Wenn Sie den obigen Code verwenden, um Excel zu exportieren, werden Sie feststellen, dass der Hintergrund von Excel weiß ohne Excels kleine Gitter ist. Dies liegt daran, dass der Standardhintergrund von Jasper weiß ist und es einfacher ist, beim Exportieren anderer Formate kompatibel zu sein. Natürlich ist es nicht notwendig, Excel zu exportieren. Fügen Sie einfach die folgenden zwei Zeilen hinzu, um es zu lösen.
// Entfernen Sie den leeren Exporter.setParameter vor zwei Zeilen (jrxlSexporterParameter.is_remove_Empty_space_between_rows, boolean.true); exporter.setParameter (jrxlSexporterParameter.is_remove_Empty_space_between_columns, boolean.true); // Setzen Sie die Hintergrundfarbe der Excel -Tabelle auf den Standard -White Exporter.SetParameter (jrxlSexporterParameter.is_White_Page_Background, boolean.false);
2. Das Datenvolumen ist groß, der Titel wird mehrmals geschrieben
Wenn Sie viele Blattdaten haben, können Sie auf die Situation stoßen, in der der Tabellenkopf mehrmals gedruckt wird. In diesem Fall müssen Sie die Höheneinstellung hinzufügen.
Field pageHeight = jrbasereport.class.getDeclaredfield ("PageHeight"); pageHeight.setAccessible (true); pageHeight.setint (Jasperreport, Integer.max_value);3.. Zelltypproblem
Manchmal muss der Excel -Bericht, den wir exportieren, mithilfe von Excel -Funktionen berechnet werden. Wenn alle in Textformaten sind, können wir es natürlich nicht berechnen. In diesem Fall müssen wir verwenden
// Wählen Sie automatisch den Format Exporter.setParameter (jrxlSexporterParameter.is_detect_cell_type, boolean.true);
Denken Sie beim Entwerfen eines Berichts den richtigen Typ des Feldfelds aus.
4. Das Problem mehrerer Blätter
Das obige einfache Beispiel ist nur eine Datei mit einer Blattseite. Was ist, wenn unsere Anforderung darin besteht, mehrere Blätter in eine Datei zu exportieren? Keine Sorge, dieser Japser hat bereits für uns gedacht.
Ändern Sie einfach die obigen Exportschritte in die folgenden
baos = new bytearrayoutputStream (); exporter = new Jrxlsxexporter (); exporter.setParameter (jrexporterParameter.jasper_print_list, listjasperprint); exporter.setParameter (jrexporterparameter.output_stream, baOs). exporter.setParameter (jrxlSexporterParameter.is_one_Page_Per_Sheet, boolean.true);
JrexporterParameter.jasper_print_List, übergeben in einer Sammlung von ListjasperPrints, jeder Jasperprint ist eine Blattseite.
5. Im Linux -Start wird kein Fehler gemeldet, der Bericht kann jedoch nicht exportiert werden
Tatsächlich hat mich dieses Problem lange Zeit gestört. Später erinnerte ich mich mit Hilfe des Chefs an das Problem, weil es überhaupt keine Ausnahme gemacht hat, sondern einen Fehler. Ich habe gesehen, dass einige Klassenkameraden diese Frage online gestellt haben, also habe ich sie gepostet.
Sie können Throwable verwenden, um die Fehlermeldung zu erfassen und die Fehlermeldung abzurufen: java.lang.InternalError: Verwenden
Lösung: Ändern Sie Tomcat/bin/catalina.sh und fügen Sie java_opts = "$ java_opts -djava.awt.headless = true" hinzu "
6. Big Data Memory Überlauf und Memory Leckage -Probleme! !
Ich muss über den Unterschied zwischen Excel 03 und 07 -Versionen sprechen. Ich erinnere mich, dass die 03 -Version nur 65532 Zeilen unterstützt, aber nach der 07 -Version wurde sie viel größer. Ich habe die spezifische Zahl vergessen, es ist sowieso nicht die gleiche Größenordnung.
JrxLSXExporter unterstützt den Exportieren von XLSX -Dateien.
JrxlSexporter ist eine XLS -Datei, die leicht zu identifizieren ist. Die exportierten Werkzeuge sind die gleichen wie in Excel.
Dann gibt es den Speicherüberlauf und den Speicherleckproblemen. Ich glaube, dass Freunde, die Java spielen, dies im Grunde genommen begegnet sind.
Die häufigste Lösung für den Speicherüberlauf besteht darin, die Speichergröße des Containers zu erhöhen und die Speichergröße von Tomcat zu erhöhen. Sie können Baidu verwenden, es gibt viele Methoden, sodass Sie das Rad nicht neu gestalten.
Hier ist eine Erinnerung daran, dass die Konfigurationsmethoden der Windows -Installation, Dekompression und Linux unterschiedlich sind, wenn Sie Tomcat verwenden.
Was ich hier vorstellen muss, ist die Jasperreport -Methode. Jasperreport hat eine Lösung für Big Data. Es wurde in einer sehr frühen Version, dem Emulator von JrFileVirtualizer, auf den Markt gebracht.
Wofür wird dieses Ding verwendet? Tatsächlich werden Daten an eine temporäre Datei auf der Festplatte entsprechend den von Ihnen festgelegten Parametern geschrieben, die das Problem der übermäßigen Speicherverwendung und des Überlaufs beim Ausfüllen von Berichten löst.
Derzeit hat Jasperreport 3 Emulatoren, die alle zur Lösung dieses Problems verwendet werden.
Sie sind:
①jrFilevirtualizer
②jrswaPFileVirtualizer
③jrgzipvirtualizer
Was ist der Unterschied zwischen diesen drei Emulatoren?
Zuerst habe ich den frühesten JrFilevirtualizer auf den Markt gebracht. Als ich testete, meldete ich beim Exportieren von etwa 30 W Daten den Speicherüberlauf. Später, nachdem ich dies hinzugefügt hatte, konnte ich es normal exportieren. Dieser Emulator generiert eine temporäre Datei für jedes Objekt und speichert sie auf der Festplatte, um das Problem der Speicherverbrauch zu lösen. Da jedoch viele temporäre Dateien generiert werden, wird der Speicherverbrauch der Dateierstellung und des Löschens unsichtbar erhöht, sodass er nicht sehr empfohlen wird.
// Mehrere Dateien schreiben jrFileVirtualizer virtualizer = new JrFileVirtualizer (2, CatchPath); Map <string, object> parameterervalue = new HashMap <String, Object> (); parameterervalue.put (jrparameter.report_virtualizer, virtualizer);
virtualizer.setReadonly (true);
Catchpath ist der Datei -Cache -Pfad und muss vorhanden sein, andernfalls wird ein Fehler gemeldet.
Dann gibt es JRSWAPFILEVIRTUALICERS, der gestartet wurde, um das Problem von JrFileVirtualizer zu lösen. Dieser Emulator erstellt nur eine temporäre Datei, und jedes Objekt berücksichtigt einen Teil dieser Datei, sodass der Speicherverbrauch von Dateierstellung und Löschung reduziert wird. Tatsächlich wird dies nicht besonders empfohlen.
// Schreiben Sie eine einzige Datei RSWAPFILE ARQUIVOSWAP = NEW JRSWAPFILE (CACKPATH, 4096, 25); Map <string, object> parameterervalue = new HashMap <String, Object> (); ParameterValue.put (jrparameter.report_virtualizer, virtualizer);
virtualizer.setReadonly (true);
Schließlich gibt es jrgzipvirtualizer. Wenn Sie GZIP sehen, wissen Sie nicht, ob Sie eine Verbindung zur Wortkomprimierung haben. Das ist richtig, dieser Emulator verwendet einen speziellen Komprimierungsalgorithmus, der den Speicher Fußabdruck auf ein Zentiet oder ein Tw-Zwischener komprimieren kann, was erstaunlich ist.
JrabstractLruvirtualizer virtualizer = new jrgzipvirtualizer (2); map <String, Objekt> ParameterValue = new Hashmap <String, Objekt> (); parameterervalue.put (jrparameter.report_virtualizer, virtualizer); jasperprint = jasspertefillManager. DataSource);
Kurz gesagt, es gibt drei Arten von Emulatoren, um das Problem des Speicherüberlaufs zu lösen. Ich habe auch viele Blogs gelesen, die JrFileVirtualizer verwenden, um das Problem der Memory Big Data zu lösen. Dann möchte ich hier sagen, dass ich am wenigsten empfehle, JrFileVirtualizer -Emulator zu verwenden, da er nicht nur viele Dateien zum Erstellen konsumiert, sondern auch einen sehr ernsthaften Fehler- und Speicherleck hat! ! ! Es gibt auch JRSWAPFILEVIRTUALISCHER, der dieses Problem hat.
Darüber hinaus sollte beachtet werden, dass ohne Verwendung des Emulators Speicher -Leckage -Probleme auftreten. Wenn Sie den Bericht exportieren, entfernen Sie die Stapelinformationen und stellen Sie fest, dass es viele Instanzen der net.sf.jasperreports.engine.fill.jrtemplateprinttext -Klasse gibt, die nicht recycelt werden kann und nicht recycelt werden kann! ! ! Und dieses Problem besteht immer noch in der neuesten Version von Japserport 6.x. Es gibt viele solche Probleme in der Jasper Community und in Stack Overflow, aber es gibt keine Lösung.
Hier empfehlen wir den Emulator von Jrgzipvirtualizer. Obwohl es aufgrund des einzigartigen Komprimierungsalgorithmus immer noch Leckprobleme gibt, wurde das Problem der Speicherleckage auf einen sehr geringen Bereich gesteuert. Es wird als Lösung angesehen, um die durchgesickerte Speicherverwendung um etwa 90%zu lindern.
Im Allgemeinen habe ich diesen Plan jetzt aufgegeben und ihn ausgeschrieben, damit meine Brüder Umwege später vermeiden. Nachdem ich eine Poi -Toolklasse erhalten habe, werde ich mich als nächstes darauf vorbereiten, alle Berichte in POI -Exportmethoden zu ändern. Apropos, die Poi Big Data -Lösung ist ziemlich gut.