¿Cómo mostrar / ocultar una columna en tiempo de ejecución?

Me gustaría mostrar / ocultar una columna en tiempo de ejecución en función de una condición en particular. Estoy usando “Imprimir cuando expresión” para mostrar / ocultar condicionalmente esta columna (y su encabezado) en mi informe. Cuando la columna está oculta, el espacio que habría ocupado se deja en blanco, lo que no es particularmente atractivo.

Preferiría si el espacio extra se usara de una manera más efectiva, las posibilidades incluyen:

  • el ancho del informe se reduce por el ancho de la columna oculta
  • el espacio extra se distribuye entre las columnas restantes

En teoría, podría lograr lo primero al establecer el ancho de la columna (y el encabezado) en 0, pero también indicar que la columna debe cambiar de tamaño para ajustarse a su contenido. Pero JasperReports no proporciona una opción de “cambiar el tamaño para ajustar el contenido”.

Otra posibilidad es generar informes utilizando la API de Jasper en lugar de definir la plantilla de informe en XML. Pero eso parece un gran esfuerzo para un requisito tan simple.

En la versión posterior (v5 o superior) de los informes de jaspe, puede usar el componente jr:table y realmente lograr esto (sin el uso de código java como el uso de dynamic-jasper o informes dynamics).

El método está utilizando un debajo de

Ejemplo

Data de muestra

 +----------------+--------+ | User | Rep | +----------------+--------+ | Jon Skeet | 854503 | | Darin Dimitrov | 652133 | | BalusC | 639753 | | Hans Passant | 616871 | | Me | 6487 | +----------------+--------+ 

Muestra jrxml

Nota : el parámetro $P{displayRecordNumber} y el en la primera jr:column

                  <band height="50"> <componentelement> <reportelement key="table" style="table" x="0" y="0" width="555" height="47" uuid="76ab08c6-e757-4785-a43d-b65ad4ab1dd5"></reportelement> <jr:table xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd"> <datasetrun subDataset="tableDataset" uuid="07e5f1c2-af7f-4373-b653-c127c47c9fa4"> <datasourceexpression><![CDATA[$P{REPORT_DATA_SOURCE}]]></datasourceexpression> </datasetrun> <jr:column width="90" uuid="918270fe-25c8-4a9b-a872-91299cddbc31"> <printwhenexpression><![CDATA[$P{displayRecordNumber}]]></printwhenexpression> <jr:columnheader style="table_CH" height="30" rowSpan="1"> <statictext> <reportelement x="0" y="0" width="90" height="30" uuid="5cd6da41-01d5-4f74-99c2-06784f891d1e"></reportelement> <textelement textAlignment="Center" verticalAlignment="Middle"></textelement> <text><![CDATA[Record number]]></text> </statictext> </jr:columnheader> <jr:detailcell style="table_TD" height="30" rowSpan="1"> <textfield> <reportelement x="0" y="0" width="90" height="30" uuid="5fe48359-0e7e-44b2-93ac-f55404189832"></reportelement> <textelement textAlignment="Center" verticalAlignment="Middle"></textelement> <textfieldexpression><![CDATA[$V{REPORT_COUNT}]]></textfieldexpression> </textfield> </jr:detailcell> </jr:column> <jr:column width="90" uuid="7979d8a2-4e3c-42a7-9ff9-86f8e0b164bc"> <jr:columnheader style="table_CH" height="30" rowSpan="1"> <statictext> <reportelement x="0" y="0" width="90" height="30" uuid="61d5f1b6-7677-4511-a10c-1fb8a56a4b2a"></reportelement> <textelement textAlignment="Center" verticalAlignment="Middle"></textelement> <text><![CDATA[Username]]></text> </statictext> </jr:columnheader> <jr:detailcell style="table_TD" height="30" rowSpan="1"> <textfield> <reportelement x="0" y="0" width="90" height="30" uuid="a3cdb99d-3bf6-4c66-b50c-259b9aabfaef"></reportelement> <box leftPadding="3" rightPadding="3"></box> <textelement verticalAlignment="Middle"></textelement> <textfieldexpression><![CDATA[$F{User}]]></textfieldexpression> </textfield> </jr:detailcell> </jr:column> <jr:column width="90" uuid="625e4e5e-5057-4eab-b4a9-c5b22844d25c"> <jr:columnheader style="table_CH" height="30" rowSpan="1"> <statictext> <reportelement x="0" y="0" width="90" height="30" uuid="e1c07cb8-a44c-4a8d-8566-5c86d6671282"></reportelement> <textelement textAlignment="Center" verticalAlignment="Middle"></textelement> <text><![CDATA[Reputation]]></text> </statictext> </jr:columnheader> <jr:detailcell style="table_TD" height="30" rowSpan="1"> <textfield pattern="#,##0"> <reportelement x="0" y="0" width="90" height="30" uuid="6be2d79f-be82-4c7b-afd9-0039fb8b3189"></reportelement> <box leftPadding="3" rightPadding="3"></box> <textelement textAlignment="Right" verticalAlignment="Middle"></textelement> <textfieldexpression><![CDATA[$F{Rep}]]></textfieldexpression> </textfield> </jr:detailcell> </jr:column> </jr:table> </componentelement> </band>   

Salida con $ P {displayRecordNumber} = true

cierto

Salida con $ P {displayRecordNumber} = falso

falso

Como puede ver, las columnas se adaptan muy bien sobre la base de las cuales se muestran.

JasperDesign se usa para modificar el objeto de plantilla (JasperReport) desde dentro del código en tiempo de ejecución. Supongo que esto podría encajar en tu caso.

Una ligera variación en el tema del “segundo informe” que he utilizado es aislar la parte del informe donde tiene una columna opcional en su propio subinforme, y luego crear dos subinformes, uno con y sin la columna, y luego usar condiciones para determinar qué subinforme imprimir.

Eliminar línea cuando está en blanco: esta opción quita el espacio vertical ocupado por un objeto, si no es visible; la visibilidad del elemento está determinada por el valor de la expresión contenida en el atributo Imprimir cuando expresión. Piense en la página como una cuadrícula donde se colocan los elementos, con una línea que es el espacio que ocupa el elemento. La Figura 4-17 resalta la línea del elemento A; para eliminar realmente esta línea, todos los elementos que comparten una parte de la línea tienen que ser nulos (es decir, no se imprimirán).

Recomiendo usar DynamicReports , es de código abierto y está basado en JasperReports. El principal beneficio de esta biblioteca es un diseño de informe dynamic y sin necesidad de un diseñador visual de informes.

Si solo se trata de una columna, ¿es posible ubicar esta columna en el extremo derecho y luego utilizar la expresión print when? De esa manera no hay un agujero en el medio. Sé que esto no es ideal, ya que intenté hacer lo que actualmente está tratando de lograr en el pasado, y no pude encontrar lo que llamo una buena solución.

Una segunda idea sería crear un segundo informe basado en el primero sin salir de la columna, y luego, al llamar el informe, verificar la condición, para decidir a cuál llamar. De nuevo, no es ideal, pero funcionaría.

Sé que esta no es realmente la respuesta que estabas buscando, pero una de estas sugerencias puede funcionar para ti.

Verifique ESTO En ese tutorial están usando una plantilla XML con Velocity framework. Esto es bastante complejo. Y para hacerlo más simple, puedes usar DynamicJasper . Esta biblioteca es una API Java de código abierto que funciona sobre JasperReports y resuelve el problema de columnas dinámicas.

Supongo que esta respuesta llega demasiado tarde, pero la agrego para el registro. En mi caso, podría resolverlo sin dependencias ni herramientas adicionales. En el archivo JRXML, acabo de agregar el ancho de los campos de texto un ancho dynamic varias veces. Una vez por ancho posible eso es. Luego, en cada campo de texto, he establecido que solo se debe imprimir en caso de una determinada condición.

Esto puede no ser tan elegante como establecer el ancho de forma dinámica, pero lo hace sin complicaciones con bibliotecas adicionales.