Passons au sujet et présentons JasperReport, Ireport ou Jasperstudio d'aujourd'hui, puis deux sont ses outils de visualisation.
Qu'est-ce que JasperReport?
Ce produit compte en fait de nombreux utilisateurs domestiques. Il s'agit d'un produit étranger, et on peut dire qu'il est largement utilisé dans le domaine des rapports Java.
Quand je suis entré en contact avec ce rapport pour la première fois, je l'ai beaucoup aimé. La chose la plus importante est son outil de visualisation, ce qui m'a vraiment permis de m'arrêter. Je pourrais réellement concevoir des rapports Java en dessinant simplement des images. En parlant de dessin, nous pouvons utiliser des outils visuels pour concevoir des modèles de rapport visuellement, et les formats de fichiers qu'il prend en charge sont très larges, y compris Excel, Word, PDF, HTML, XML, CSV, etc.
Cela n'a-t-il pas l'air très puissant? Il est conçu à la fois et réutilisé plusieurs fois. Bien sûr, les choses puissantes ont souvent deux côtés. J'ai rencontré cela et m'ont torturé pendant longtemps. Je le décrirai en détail plus tard.
Les gros seins de JasperReport
J'ai dit plus tôt que JasperReport ou Ireport ou Jasperstudio était en fait inexact. Le deuxième frère Ireport et le troisième frère Jasperstudio sont en fait des outils de conception visuelle auxiliaires de Jasper. Vous pouvez concevoir des rapports Jasper sans l'utiliser et écrire plus de blancs XML. Avant 5.5, cet outil s'appelait Ireport. Après 5,5, avec la naissance de mon troisième frère Jasperstudio, Ireport a été complètement remplacé. En fait, ces deux outils sont fondamentalement les mêmes compatriotes à un enfant.
Flux de travail spécifique:
① premier, Jasper obtiendra le fichier XML des informations de format qui doivent être sorties, puis compilent un fichier de type .jasper à partir du fichier XML. Ensuite, ce fichier Jasper peut être chargé dans notre application pour générer le rapport final. Avez-vous un sentiment très familier? Oui, cela est très similaire à Java et doit être compilé.
L'image suivante montre l'interface d'opération Ireport. C'est similaire à Jasperstudio, donc je ne le publierai pas. Vous pouvez le télécharger sur Baidu par vous-même.
Permettez-moi de présenter brièvement chaque type de bande dans l'image ci-dessus.
(1) Titre Band: Le segment de titre ne s'affiche que sur la partie supérieure de la première page de l'ensemble du rapport. À l'exception de la première page, peu importe le nombre de pages dans le rapport, le contenu de la bande de titre n'apparaîtra plus.
(2) PageHeader Band: Comme son nom l'indique, le contenu du segment PageHeader apparaîtra dans chaque page de l'ensemble du rapport et sera affiché en haut de la page. S'il s'agit de la première page du rapport, le contenu du PageHeader sera affiché sous la bande de titre. Dans toutes les autres pages, à l'exception de la première page, le contenu du PageHeader sera affiché en haut de la page.
(3) Pagefooter Band: affiché en bas de l'extrémité de la page.
(4) LastPageFooter Band: Affiché en bas de la dernière page.
(5) Bande de détail: segment de contenu du rapport, contenu qui doit être répété dans le rapport de conception de cette bande, et le contenu du segment de détail apparaîtra à chaque page.
(6) Colonnedheader Band: Pour le segment d'en-tête de la bande de détail, généralement dans ce segment, l'en-tête du rapport est dessiné.
(7) Columnfooter Band: pour la fin du tableau de la bande de détail.
(8) Bande de résumé: Le segment total du tableau apparaît après la bande de détail de la dernière page de l'ensemble du rapport. Il est généralement utilisé pour compter la valeur totale d'un ou plusieurs champs dans le rapport.
Ce qui précède est tous les outils de visualisation. En fait, il est très simple à utiliser. Vous pouvez le trouver en l'explorant. Comme c'est un véritable enregistrement de la fosse, ce n'est naturellement pas le point, donc je n'en parlerai pas.
Applications en code
Ce sont les étapes que j'ai résumées. Peut-être que la description n'est pas très précise. Veuillez le faire.
Modèles de conception, générer des fichiers JRXML, ↑↑ l'outil de visualisation ci-dessus conçoit les styles de modèle dont vous avez besoin
② Modèles de compilation, JRXML est compilé dans des fichiers Jasper, tout comme les fichiers .java et .class en Java, le programme doit exécuter le fichier binaire de * .jasper.
En fait, cette étape peut être directement compilée avec Ireport pour générer .jasper, et bien sûr, il peut également être compilé via le programme Jasper lors de l'exécution. Cependant, il est recommandé que si elle est compilée dans le programme, la version Jasper est mieux cohérente avec la version Ireport ou Jasperstudio.
③ Rapport Execute (les données sont remplies dans le rapport)
1. Chargez le modèle pour générer un objet JasperReport
2. Utilisez JasperFillManager pour générer un objet JasperPrint
④finalement, utilisez JrxlsxExporter pour exporter le rapport ou afficher
Modèles de chargement
Étant donné que nous avons généré des fichiers .jasper ou .jrxml à l'aide d'outils de visualisation, nous devons naturellement laisser le programme le charger.
Code chargé, renvoyez l'objet Jasperport
if (urlpath.endswith (". jrxml")) {// compiler jrxml à jasper try {inputStream is = url.openStream (); JasperReport = JasperCompileManager .......... } catch (ioException e) {Throw New BasEException ("Charge Jasper Error", E); } catch (jrexception e) {Throw New BasEException ("Le modèle JRXML se transforme en erreur de fichier jasper", e); } catch (Throwable E) {Throw New BasEException ("Le modèle JRXML se transforme en erreur de fichier Jasper", E); } Catch (Throwable E) {log.Error (e); lancer une nouvelle base de base (e.getMessage ()); }} else if (urlpath.endswith (". jasper")) {try {inputStream is = url.openStream (); jasperReport = (jasperReport) jrloader.loadObject (IS); } catch (ioException e) {Throw New BasEException ("Charge Jasper Error", E); } catch (jrexception e) {throw new BasEException ("l'erreur de fichier de modèle Jrxml", e); } Catch (Throwable E) {log.Error (e); lancer une nouvelle base de base (e.getMessage ()); }} else {throw new BasEException ("Fichier non valide!"); }Obtenez la source de données dans le rapport
Ici, j'utilise Javabean pour l'obtenir
Jrdatasource dataSource = null; if (fieldValues! = null && fieldvalues.size ()> 0) {dataSource = new JrbeanCollectionDataSource (fieldValues); } else {dataSource = new JrempTyDataSource (); } FieldValues est la collection de Pojos obtenus dans la base de données.
Effectuer le remplissage du rapport
Obtenez l'objet JasperPrint
Map <string, objet> ParameTervalue = new HashMap <String, Object> (); jasperPrint = jasperFillManager.FillReport (JasperReport, ParameTervalue, DataSource);
Enfin, nous utilisons JrxlsxExporter pour exporter le rapport
C'est aussi l'endroit où les paramètres de configuration les plus importants sont requis
baos = new bytearrayoutputStream (); exportation = new JrxlsxExporter (); exportation.setParameter (jrexporterParameter.jasper_print, jasperprint); Exporter.SetParameter (jrexporterParameter.output_stream, baos);
Exporter.ExportPort ();
Terminé, les données ont été écrites dans le flux de sortie. Vous décidez comment le sortir vous-même, est-ce beaucoup plus bref que les autres méthodes d'introduction du code.
En effet, JasperReport a un avantage incomparable dans l'écriture de code, et diverses API ont été emballées. Mais il se peut que Chacha ait trop fait et qu'il y a beaucoup de problèmes.
Le problème de JasperReport
1. L'espace vide avant deux rangées
Si vous utilisez le code ci-dessus pour exporter Excel, vous constaterez que l'arrière-plan d'Excel est blanc, sans les petites grilles d'Excel. En effet, l'arrière-plan par défaut de Jasper est blanc, il est donc plus facile d'être compatible lors de l'exportation d'autres formats. Bien sûr, il n'est pas nécessaire d'exporter Excel. Ajoutez simplement les deux lignes suivantes pour le résoudre.
// Retirez le vierge exportateur.setParameter avant deux lignes (jrxlsexporterParameter.is_remove_empty_space_between_rows, boolean.true); Exporter.SetParameter (jrxlsexporterParameter.is_remove_empty_space_between_columns, boolean.true); // Définissez la couleur d'arrière-plan de la table Excel sur l'exportateur blanc par défaut.SetParameter (jrxlsexporterParameter.is_white_page_background, boolean.false);
2. Le volume de données est grand, le titre est écrit plusieurs fois
Si vous avez beaucoup de données de feuilles, vous pouvez rencontrer la situation où l'en-tête de la table est imprimée plusieurs fois. Dans ce cas, vous devez ajouter le réglage de hauteur.
Field PageHeight = jrbaseReport.class.getDeclaredField ("PageHeight"); PageHeight.SetAccessible (true); PageHeight.SetInt (JasperReport, Integer.Max_Value);3. Problème de type de cellule
Parfois, le rapport Excel que nous exportons doit être calculé à l'aide des fonctions Excel. Si tous sont dans des formats de texte, nous ne pouvons naturellement pas le calculer. Dans ce cas, nous devons utiliser
// sélectionnez automatiquement le format exportateur.setParameter (jrxlsexporterParameter.is_dect_cell_type, boolean.true);
N'oubliez pas que lors de la conception d'un rapport, sélectionnez le type correct du champ de champ.
4. Le problème de plusieurs feuilles
L'exemple simple ci-dessus n'est qu'un fichier contenant une page de feuille. Que se passe-t-il si notre exigence était d'exporter plusieurs feuilles dans un seul fichier? Ne vous inquiétez pas, ce Japser a déjà pensé pour nous.
Changez simplement les étapes d'exportation ci-dessus vers les éléments suivants
baos = new ByteArrayOutputStream (); Exporter = new JrxLSxExporter (); exportter.setParameter (jrexporterParameter.jasper_print_list, listjasperprint); exporter.setParaMeter (jrexporterparamètre.output_stream, baos); Exporter.SetParameter (jrxlsexporterParameter.is_one_page_per_sheet, boolean.true);
JrexporterParameter.jasper_print_list, passez dans une collection de ListJasperPrints, chaque JasperPrint est une page de feuille.
5. Aucune erreur n'est rapportée dans le démarrage de Linux, mais le rapport ne peut pas être exporté
En fait, ce problème m'a dérangé depuis longtemps. Plus tard, avec l'aide du patron, je me suis souvenu du problème, car il n'a pas du tout lancé une exception, mais une erreur. J'ai vu que certains camarades de classe ont posé cette question en ligne, alors je l'ai posté.
Vous pouvez utiliser Throwable pour capturer le message d'erreur et obtenir le message d'erreur: java.lang.internalerror: Impossible de se connecter au serveur de fenêtres X11 à l'aide de ': 0,0'
Solution: modifiez Tomcat / bin / Catalina.sh et ajoutez java_opts = "$ java_opts -djava.awt.headless = true"
6. Problèmes de débordement de la mémoire des mégadonnées et de fuite de la mémoire! !
J'ai besoin de parler de la différence entre les versions Excel 03 et 07. Je me souviens que la version 03 ne prend en charge que 65532 lignes, mais après la version 07, elle est devenue beaucoup plus grande. J'ai oublié le nombre spécifique, ce n'est pas du même ordre de grandeur de toute façon.
JrxlsxExporter prend en charge l'exportation de fichiers xlsx.
JrxlSExporter est un fichier XLS, qui est facile à identifier. Les outils exportés sont les mêmes que ceux d'Excel.
Ensuite, il y a les problèmes de débordement de mémoire et de fuite de mémoire. Je crois que les amis qui jouent Java ont essentiellement rencontré cela.
La solution la plus courante au débordement de la mémoire consiste à augmenter la taille de la mémoire du conteneur et à augmenter la taille de la mémoire de Tomcat. Vous pouvez utiliser Baidu, il existe de nombreuses méthodes, donc vous ne referez pas la roue.
Voici un rappel que si vous utilisez TomCat, les méthodes de configuration de l'installation, de la décompression et de la décompression de Windows sont différentes, veuillez donc faire attention.
Ce que je dois présenter ici, c'est la méthode JasperReport. En fait, JasperReport a une solution aux mégadonnées. Il a été lancé dans une version très précoce, l'émulateur de JrfileVirtualzer.
À quoi sert cette chose? En fait, il rédigera des données dans un fichier temporaire sur le disque dur en fonction des paramètres que vous définissez, ce qui résout le problème de l'utilisation excessive de la mémoire et du débordement lors du remplissage des rapports.
Actuellement, JasperReport a 3 émulateurs, qui sont tous utilisés pour résoudre ce problème.
Ils sont:
①JrfileVirtualzer
②JRSWAPFILEVirtualizer
③jrgzipvirtualizer
Quelle est la différence entre ces trois émulateurs?
Tout d'abord, j'ai lancé le premier JrfileVirtualzer. Lorsque je testais, lorsque j'ai exporté environ 30 W de données, cela rapporterait un débordement de mémoire. Plus tard, après avoir ajouté cela, je pouvais l'exporter normalement. Cet émulateur générera un fichier temporaire pour chaque objet et le stockera sur le disque dur pour résoudre le problème d'utilisation de la mémoire. Cependant, comme de nombreux fichiers temporaires sont générés, la consommation de mémoire de la création de fichiers et de la suppression est invisiblement augmentée, il n'est donc pas très recommandé.
// Écrivez plusieurs fichiers jrfileVirtualizer virtualizer = new JRFileVirtualizer (2, CatchPath); Map <string, object> ParameTervalue = new HashMap <String, object> (); ParameTervalue.put (jrParameter.Report_Virtualizer, Virtualizer);
virtualizer.setReadOnly (true);
CatchPath est le chemin du cache de fichier et doit exister, sinon une erreur sera signalée.
Ensuite, il y a JRSWAPFileVirtualizer, qui a été lancé pour résoudre le problème de JrfileVirtualizer. Cet émulateur ne créera qu'un fichier temporaire, et chaque objet expliquera une partie de ce fichier, de sorte que la consommation de mémoire de la création de fichiers et de la suppression est réduite. En fait, cela n'est pas particulièrement recommandé.
// Écrivez un seul fichier RSWAPFile arquivoswap = new JRSWAPFILE (CatchPath, 4096, 25); JrabstractlRuvirtualizer virtualizer = new JRSWAPFileVirtualizer (2, arquivoswap, true); Map <string, object> ParameTervalue = new HashMap <String, Object> (); ParameTervalue.put (jrParameter.Report_Virtualizer, Virtualizer);
virtualizer.setReadOnly (true);
Enfin, il y a jrgzipvirtualizer. Lorsque vous voyez GZIP, vous ne savez pas si vous avez un lien avec la compression des mots. C'est vrai, cet émulateur utilise un algorithme de compression spécial qui peut compresser l'empreinte de la mémoire à un deux ou à un seul, ce qui est incroyable.
JrabStractlRuvirtualizer virtualizer = new JRGZipVirtualzer (2); map <string, object> ParameterValue = new Hashmap <String, Object> (); ParameterValue.put (jrParameter.Report_Virtualzer, virtualizer); jasperprint = jasperfillmanager.fillreport (JasperReport, paramètre, paramètre, paramètre, paramètre, paramètre, paramètre, paramètre, paramètre, paramètre, paramètre. dataSource);
Cela dit, en bref, il existe trois types d'émulateurs pour résoudre le problème de débordement de la mémoire. J'ai également lu de nombreux blogs qui utilisent JrfileVirtualzer pour résoudre le problème de la mémoire des mégadonnées. Ensuite, je veux dire ici que je recommande le moins d'utiliser l'émulateur JrfileVirtualzer car il consomme non seulement beaucoup de fichiers à créer, mais a également une fuite de bug et de mémoire très sérieuse! ! ! Il y a aussi JRSWAPFileVirtualizer qui a ce problème.
De plus, il convient de noter que sans utiliser l'émulateur, il y aura des problèmes de fuite de mémoire. Lorsque vous exportez le rapport, videz les informations de la pile et constatez qu'il existe de nombreuses instances de la classe net.sf.jasperreports.engine.fill.jrtemplateprinttext, qui ne peut pas être recyclée et ne peut pas être recyclée! ! ! Et ce problème existe toujours dans la dernière version de JapserReport 6.x. Il y a beaucoup de ces problèmes dans la communauté Jasper et Stack Overflow, mais il n'y a pas de solution.
Ici, nous recommandons l'émulateur JRGZipVirtualizer. Bien qu'il y ait encore des problèmes de fuite, en raison de l'algorithme de compression unique, le problème de fuite de mémoire a été contrôlé à une très petite gamme. Il est considéré comme une solution pour atténuer l'utilisation de la mémoire divulguée d'environ 90%.
En général, j'ai abandonné ce plan maintenant et je l'ai écrit pour que mes frères évitent les détours plus tard. Après avoir obtenu une classe d'outils POI, je me préparerai ensuite à changer tous les rapports en méthodes d'exportation POI. En parlant de cela, la solution de Big Data POI est assez bonne.