Vayamos al tema y presentemos el JasperReport, Iraport o Jasperstudio de hoy, y luego dos son sus herramientas de visualización.
¿Qué es JasperReport?
Este producto en realidad tiene muchos usuarios nacionales. Es un producto extranjero, y se puede decir que se usa ampliamente en el campo de informes de Java.
Cuando entré en contacto por primera vez con este informe, me gustó mucho. Lo más importante es su herramienta de visualización, que realmente me hizo incapaz de detenerse. De hecho, podría diseñar informes de Java simplemente dibujando imágenes. Hablando de dibujo, podemos usar herramientas visuales para diseñar plantillas de informes visualmente, y los formatos de archivo que admite son muy amplios, incluidos Excel, Word, PDF, HTML, XML, CSV, etc.
¿No se ve muy poderoso? Está diseñado a la vez y se reutiliza varias veces. Por supuesto, las cosas poderosas a menudo tienen dos lados. Me encontré con esto y me torturé durante mucho tiempo. Lo describiré en detalle más tarde.
Los grandes pechos de JasperReport
Dije anteriormente que JasperReport o Iraport o Jasperstudio son realmente inexactos. El segundo hermano Iraport y el tercer hermano Jasperstudio son en realidad las herramientas de diseño visual auxiliar de Jasper. Puede diseñar informes de Jasper sin usarlo y escribir más blancos XML. Antes de 5.5, esta herramienta se llamaba IReport. Después de 5.5, con el nacimiento de mi tercer hermano Jasperstudio, Iraport fue completamente reemplazado. De hecho, estas dos herramientas son básicamente las mismas compatriotas de un hijo.
Flujo de trabajo específico:
①First, Jasper obtendrá el archivo XML de la información de formato que debe ser emitida, y luego compilará un archivo de tipo .Jasper del archivo XML. Luego, este archivo Jasper se puede cargar en nuestra aplicación para generar el informe final. ¿Tienes un sentimiento muy familiar? Sí, esto es muy similar a Java y necesita ser compilado.
La siguiente imagen muestra la interfaz de operación IReport. Es similar a JasPerstudio, por lo que no lo publicaré. Puedes descargarlo en Baidu solo.
Permítanme presentar brevemente cada tipo de banda en la imagen de arriba.
(1) Banda de título: el segmento de título solo se muestra en la parte superior de la primera página de todo el informe. A excepción de la primera página, no importa cuántas páginas haya en el informe, el contenido de la banda de título ya no aparecerá.
(2) Page Header Band: Como su nombre indica, el contenido en el segmento de Page Header aparecerá en cada página de todo el informe, y se mostrará en la parte superior de la página. Si es la primera página del informe, el contenido en la página de página se mostrará en la banda de título. En todas las demás páginas, excepto en la primera página, el contenido en la página de página se mostrará en la parte superior de la página.
(3) Pagefooter Band: se muestra en el extremo inferior de la página.
(4) LastPageFooter Band: se muestra en la parte inferior de la última página.
(5) Banda de detalle: segmento de contenido de informe, contenido que debe repetirse en el informe de diseño en esta banda, y el contenido en el segmento de detalles aparecerá en cada página.
(6) Banda de cabeza de columna: para el segmento de encabezado de la banda de detalles, generalmente en este segmento, se dibuja el encabezado del informe.
(7) Banda del pie de columna: para el final de la tabla de la banda de detalles.
(8) Banda resumida: el segmento total de la tabla aparece después de la banda de detalles en la última página de todo el informe. Generalmente se usa para contar el valor total de uno o varios campos en el informe.
Lo anterior son todas las herramientas de visualización. De hecho, es muy simple de usar. Puedes encontrarlo explorándolo. Dado que es un registro real del pozo, este, naturalmente, no es el punto, por lo que no hablaré de eso.
Aplicaciones en el código
Estos son los pasos que he resumido. Quizás la descripción no sea muy precisa. Por favor hazlo.
① Plantillas de diseño, generar archivos JRXML, ↑↑ La herramienta de visualización anterior diseña los estilos de plantilla que necesita
② Plantillas de compilación, JRXML se compila en archivos Jasper, al igual que los archivos .java y .class en Java, el programa debe ejecutar el archivo binario de *.Jasper.
De hecho, este paso se puede compilar directamente con IReport para generar .Jasper y, por supuesto, también se puede compilar a través del programa Jasper en tiempo de ejecución. Sin embargo, se recomienda que si se compila en el programa, la versión Jasper es mejor consistente con la versión IraPort o JasPerstudio.
③ Informe Execute (los datos se llenan en el informe)
1. Cargue la plantilla para generar un objeto JasperReport
2. Use JasperfillManager para generar objeto Jasperprint
④ Finalmente, use JRXLSXEXPORTER para exportar el informe o mostrarlo
Plantillas de carga
Dado que hemos generado archivos .Jrxml .Jrxml utilizando herramientas de visualización, naturalmente necesitamos dejar que el programa lo cargue.
Código cargado, return Jasperport Object
if (urlpath.endswith (". jrxml")) {// compilar jrxml a jasper try {inputStream is = url.openStream (); jasperReport = jaspercompilemanager.compilereport (is); } Catch (ioException e) {tire nueva BaseException ("Error de carga Jasper", e); } Catch (Jrexception e) {tire nueva BaseException ("La plantilla JRXML se transforma en el error del archivo jasper", e); } catch (Throwable E) {Throw New BaseException ("La plantilla JRXML se transforma en el error del archivo Jasper", e); } catch (lanzable e) {log.error (e); tirar nueva BaseException (e.getMessage ()); }} else if (urlpath.endswith (". jasper")) {try {inputStream is = url.openStream (); jasperReport = (jasperReport) jrloader.loadObject (is); } Catch (ioException e) {tire nueva BaseException ("Error de carga Jasper", e); } Catch (Jrexception e) {tire nueva BaseException ("Error de archivo de plantilla JRXML", e); } catch (lanzable e) {log.error (e); tirar nueva BaseException (e.getMessage ()); }} else {tirar nueva BaseException ("¡Archivo no válido!"); }Obtenga la fuente de datos en el informe
Aquí uso Javabean para conseguirlo
JrdataSource dataSource = null; if (FieldValues! = NULL && FieldValues.Size ()> 0) {DataSource = new JRBeCollectionDataSource (FieldValues); } else {dataSource = new JRemptyDataSource (); } FieldValues es la colección de Pojos obtenidos en la base de datos.
Realizar el llenado de informes
Obtenga el objeto JasperPrint
MAP <String, Object> ParamTerValue = new HashMap <String, Object> (); JasperPrint = JasperfillManager.FillReport (JasperReport, Parametervalue, DataSource);
Finalmente, usamos JRXLSXEXPORTER para exportar el informe
Este es también el lugar donde se requieren la mayor cantidad de parámetros de configuración
baos = new byteArRaReOutputStream (); exporter = new JRXLSXEXPORTER (); Exporter.SetParameter (jrexporterParameter.jasper_print, jasperprint); exporter.setParameter (jrexporterParameter.output_stream, baos);
exportador.exportReport ();
Completados, los datos han sido escritos en la transmisión de salida. Usted decide cómo producirlo usted mismo, es mucho más breve que otros métodos de introducción de código.
De hecho, JasperReport tiene una ventaja incomparable en la redacción de códigos, y se han empaquetado varias API. Pero puede ser que Chacha haya hecho demasiado y hay muchos problemas.
Problema de JasperReport
1. El espacio en blanco antes de dos filas
Si usa el código anterior para exportar Excel, encontrará que el fondo de Excel es blanco, sin las pequeñas cuadrículas de Excel. Esto se debe a que el fondo predeterminado de Jasper es blanco, por lo que es más fácil ser compatible al exportar otros formatos. Por supuesto, no es necesario exportar Excel. Simplemente agregue las siguientes dos líneas para resolverlo.
// elimina el exportador en blanco. SetParameter antes de dos líneas (jrxlsexporterparameter.is_remove_empty_space_between_rows, boolean.true); Exporter.SetParameter (JRXLSEXPORTERPARAMETER.IS_REMOVE_EPMY_SPACE_BETWARE_COLUMNS, boolean.true); // Establecer el color de fondo de la tabla de Excel en el exportador blanco predeterminado.
2. El volumen de datos es grande, el título se escribe varias veces
Si tiene muchos datos de hoja, puede encontrar la situación en la que el encabezado de la tabla se imprime varias veces. En este caso, debe agregar la configuración de altura.
Campo PageHeight = jrbasereport.class.getDeclaredfield ("PageHeight"); PageHeight.SetAccessible (verdadero); PageHeight.SetInt (JasperReport, Integer.max_value);3. Problema de tipo celular
A veces, el informe de Excel que exportamos debe calcularse utilizando funciones de Excel. Si todos están en formatos de texto, naturalmente no podemos calcularlo. En este caso, necesitamos usar
// Seleccione automáticamente el formato exportador.setParameter (jrxlsexporterparameter.is_detect_cell_type, boolean.true);
Recuerde, al diseñar un informe, seleccione el tipo correcto del campo de campo.
4. El problema de múltiples hojas
El ejemplo simple anterior es solo un archivo que contiene una página de hoja. ¿Qué pasa si nuestro requisito es exportar múltiples hojas en un archivo? No se preocupe, este japser ya lo ha pensado en ello.
Simplemente cambie los pasos de exportación anteriores a lo siguiente
baos = new byteArRaReOutputStream (); exporter = new JRXLSXExporter (); exporter.setParameter (jrexporterParameter.jasper_print_list, listJasperPrint); exporter.setParameter (jrexporParParameter.output_stream, Baos); // set en verdadero, en un objeto de pluta, cada vez más amplio, cada vez se coloca un objeto individual, cada vez, se coloca un objeto individual en una parte de la pluta, se coloca un objeto individual, cada vez es un objeto. Exporter.SetParameter (jrxlsexporterParameter.is_one_page_per_sheet, boolean.true);
JrexporterParameter.jasper_print_list, pase en una colección de listJasperprints, cada jasperprint es una página de hoja.
5. No se informa ningún error en el inicio de Linux, pero el informe no se puede exportar
De hecho, este problema me ha molestado durante mucho tiempo. Más tarde, con la ayuda del jefe, recordé el problema, porque no lanzó una excepción en absoluto, sino un error. Vi que algunos compañeros de clase hicieron esta pregunta en línea, así que la publiqué.
Puede usar lanzamiento para capturar el mensaje de error y obtener el mensaje de error: java.lang.InternalError: No se puede conectar al servidor de ventana X11 usando ': 0.0' como
Solución: Modifique Tomcat/bin/Catalina.Sh y agregue java_opts = "$ java_opts -djava.awt.headless = true"
6. ¡Desbordamiento de la memoria de big data y problemas de fuga de memoria! !
Necesito hablar sobre la diferencia entre las versiones de Excel 03 y 07. Recuerdo que la versión 03 solo admite las líneas 65532, pero después de la versión 07, se hizo mucho más grande. Olvidé el número específico, no es el mismo orden de magnitud de todos modos.
JRXLSXExporter admite la exportación de archivos XLSX.
JRXLSEXPORTER es un archivo XLS, que es fácil de identificar. Las herramientas exportadas son las mismas que las de Excel.
Luego están los problemas de desbordamiento de memoria y fuga de memoria. Creo que los amigos que juegan Java básicamente se han encontrado con esto.
La solución más común al desbordamiento de la memoria es aumentar el tamaño de la memoria del contenedor y aumentar el tamaño de la memoria de Tomcat. Puede usar Baidu, hay muchos métodos, por lo que no rehacerá la rueda.
Aquí hay un recordatorio de que si está utilizando TOMCAT, los métodos de configuración de la instalación de Windows, la descompresión y Linux son diferentes, así que preste atención.
Lo que necesito presentar aquí es el método JasperReport. De hecho, JasperReport tiene una solución a Big Data. Fue lanzado en una versión muy temprana, el emulador de JRFilevirtualizer.
¿Para qué se usa esto? De hecho, escribirá datos en un archivo temporal en el disco duro de acuerdo con los parámetros que establece, que resuelve el problema del uso excesivo de la memoria y el desbordamiento al completar los informes.
Actualmente, JasperReport tiene 3 emuladores, todos los cuales se utilizan para resolver este problema.
Ellos son:
①jrfilevirtualizer
②jrswapFilevirtualizer
③jrgzipvirtualizer
¿Cuál es la diferencia entre estos tres emuladores?
Primero, lanzé el primer jrfilevirtualizer. Cuando estaba probando, cuando exporté unos 30W de datos, informaría el desbordamiento de la memoria. Más tarde, después de agregar esto, podría exportarlo normalmente. Este emulador generará un archivo temporal para cada objeto y lo almacenará en el disco duro para resolver el problema de uso de la memoria. Sin embargo, debido a que hay muchos archivos temporales generados, el consumo de memoria de la creación y eliminación de archivos aumenta invisiblemente, por lo que no se recomienda muy.
// Escribir múltiples archivos JRFILVirtualizer Virtualizer = new JRFILVirtualizer (2, CACKPATH); MAP <String, Object> ParamTerValue = new HashMap <String, Object> (); parametervalue.put (jrparameter.report_virtualizer, virtualizer);
virtualizer.setReadonly (true);
CatchPath es la ruta de caché de archivo y debe existir, de lo contrario se informará un error.
Luego está JRSWAPFILVirtualizer, que se lanzó para resolver el problema de JRFILVirtualizer. Este emulador solo creará un archivo temporal, y cada objeto representará una parte de este archivo, por lo que se reduce el consumo de memoria de la creación y eliminación del archivo. De hecho, esto no es particularmente recomendado.
// Escribir un solo archivo rswapfile arquivoswap = new JRSwapFile (CACTPATH, 4096, 25); JRABStractLRUVirtualizer virtualizer = new JRSWAPFILEVirtualizer (2, ArquivoSWAP, True); MAP <String, Object> ParamTerValue = new Hashmap <String, Object> (); ParamTerValue.put (JRParameter.Report_Virtualizer, Virtualizer);
virtualizer.setReadonly (true);
Finalmente, está JRGZIPVirtualizer. Cuando vea GZIP, no sabe si tiene alguna conexión con la compresión de la palabra. Así es, este emulador utiliza un algoritmo de compresión especial que puede comprimir la huella de la memoria a una vigésima o un solo entre, lo cual es sorprendente.
JRABStractLRUVirtualizer virtualizer = new JRGZIPVirtualizer (2); map <string, objeto> parametervalue = new HashMap <String, object> (); parametervalue.put (jrParameter.rePort_Virtualizer, virtualizer); jasperPrint = jasperfillManager.FillReport (jasPerRePort, parametRePort, parameterRePort, parametRePort, parameterRePort, parameterRePort, parametRePort, parametRePort, parameterRePort, parametRePort, paramEpLue, parameterEn dataSource);
Habiendo dicho tanto, en resumen, hay tres tipos de emuladores para resolver el problema del desbordamiento de la memoria. También he leído muchos blogs que usan JRFilevirtualizer para resolver el problema de los big data de memoria. Luego, quiero decir aquí que menos recomiendo usar el emulador JRFilevirtualizer porque no solo consume muchos archivos para crear, ¡sino que también tiene una fuga muy grave de error y memoria! ! ! También hay jrSwapFilevirtualizer que tiene este problema.
Además, debe tenerse en cuenta que sin usar el emulador, habrá problemas de fuga de memoria. Cuando exporta el informe, voltea la información de la pila y descubra que hay muchas instancias de la clase net.sf.jasperreports.engine.fill.jrtemplatePrintText, que no se puede reciclar y no se puede reciclar! ! ! Y este problema todavía existe en la última versión de JapserReport 6.x. Hay muchos problemas en la comunidad Jasper y el desbordamiento de la pila, pero no hay solución.
Aquí recomendamos el emulador JRGZIPVirtualizer. Aunque todavía hay problemas de fuga, debido al algoritmo de compresión único, el problema de fuga de memoria se ha controlado a un rango muy pequeño. Se considera una solución para aliviar el uso de la memoria filtrada en aproximadamente un 90%.
En general, he renunciado a este plan ahora, y lo escribí para que mis hermanos eviten los desvíos más tarde. Después de obtener una clase de herramienta POI, a continuación me prepararé para cambiar todos los informes en métodos de exportación de POI. Hablando de eso, la solución POI Big Data es bastante buena.