如何在运行时显示/隐藏列?

时间:2008-09-22 16:51:29

标签: java jasper-reports

我想根据特定条件在运行时显示/隐藏列。我正在使用“在表达时打印”来有条件地在我的报告中显示/隐藏此列(及其标题)。当列被隐藏时,它将占用的空间留空,这不是特别有吸引力。

我希望如果以更有效的方式使用额外空间,可能包括:

  • 报告的宽度减少了隐藏列的宽度
  • 额外空间分布在其余列中

理论上,我可以通过将列(和标题)的宽度设置为0来实现第一个,但也指示列应调整大小以适合其内容。但JasperReports没有提供“调整宽度以适应内容”选项。

另一种可能性是使用Jasper API生成报告,而不是使用XML定义报告模板。但这对于这样一个简单的要求似乎付出了很多努力。

8 个答案:

答案 0 :(得分:9)

在jasper报告的更高版本(v5或更高版本)中,您可以使用<printWhenExpression/>组件,真正实现此目的(不使用java代码,因为使用动态jasper或动态 - 的报告)。

该方法在<jr:column/>

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

实施例

示例数据

$P{displayRecordNumber}

示例jrxml

注意:参数<printWhenExpression>jr:column下的<?xml version="1.0" encoding="UTF-8"?> <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="reputation" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="a88bd694-4f90-41fc-84d0-002b90b2d73e"> <style name="table"> <box> <pen lineWidth="1.0" lineColor="#000000"/> </box> </style> <style name="table_TH" mode="Opaque" backcolor="#F0F8FF"> <box> <pen lineWidth="0.5" lineColor="#000000"/> </box> </style> <style name="table_CH" mode="Opaque" backcolor="#BFE1FF"> <box> <pen lineWidth="0.5" lineColor="#000000"/> </box> </style> <style name="table_TD" mode="Opaque" backcolor="#FFFFFF"> <box> <pen lineWidth="0.5" lineColor="#000000"/> </box> </style> <subDataset name="tableDataset" uuid="7a53770f-0350-4a73-bfc1-48a5f6386594"> <field name="User" class="java.lang.String"/> <field name="Rep" class="java.math.BigDecimal"/> </subDataset> <parameter name="displayRecordNumber" class="java.lang.Boolean"> <defaultValueExpression><![CDATA[true]]></defaultValueExpression> </parameter> <queryString> <![CDATA[]]> </queryString> <title> <band height="50"> <componentElement> <reportElement key="table" style="table" x="0" y="0" width="555" height="47" uuid="76ab08c6-e757-4785-a43d-b65ad4ab1dd5"/> <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"/> <textElement textAlignment="Center" verticalAlignment="Middle"/> <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"/> <textElement textAlignment="Center" verticalAlignment="Middle"/> <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"/> <textElement textAlignment="Center" verticalAlignment="Middle"/> <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"/> <box leftPadding="3" rightPadding="3"/> <textElement verticalAlignment="Middle"/> <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"/> <textElement textAlignment="Center" verticalAlignment="Middle"/> <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"/> <box leftPadding="3" rightPadding="3"/> <textElement textAlignment="Right" verticalAlignment="Middle"/> <textFieldExpression><![CDATA[$F{Rep}]]></textFieldExpression> </textField> </jr:detailCell> </jr:column> </jr:table> </componentElement> </band> </title> </jasperReport>

Foo()
{
   echo $PPID # pid of process that executed the function
}

输出$ P {displayRecordNumber} = true

true

输出$ P {displayRecordNumber} = false

false

正如您所看到的那样,列可以很好地根据显示的内容进行调整。

答案 1 :(得分:3)

JasperDesign用于在运行时从代码中修改模板对象(JasperReport)。我想这可能适合你的情况。

答案 2 :(得分:1)

我使用的“第二个报告”主题略有不同,就是将报告中有可选列的部分隔离到它自己的子报表中,然后创建两个子报表,一个带有一个子报表,一个没有列,然后使用条件确定要打印的子报表。

答案 3 :(得分:1)

空白时删除行:此选项会删除对象占用的垂直空间(如果是) 不可见;元素可见性由包含在表达式中的表达式的值确定 表达式属性时打印。将页面视为放置元素的网格, 一条线是元素占据的空间。图4-17突出显示元素A行;在 为了真正删除这一行,共享行的一部分的所有元素必须为null (也就是说,它们不会被打印出来)。

答案 4 :(得分:1)

我建议使用DynamicReports,它是开源的,基于JasperReports。 该库的主要优点是动态报表设计,无需可视化报表设计器。

答案 5 :(得分:0)

如果它只是一列,是否可以将此列放在最右边,然后在表达式时使用print。那样中间没有洞。我知道这不太理想,因为我曾尝试做你过去想要完成的事情,而且找不到我称之为好的解决方案。

第二个想法是根据列中的第一个创建第二个报告,然后在调用报告时检查条件,以决定调用哪一个。再次不理想,但会奏效。

我知道这不是你想要的答案,但其中一个建议可能适合你。

答案 6 :(得分:0)

检查THIS在该教程中,他们使用带有Velocity框架的XML模板。这非常复杂。为了简化您,我们可以DynamicJasper。该库是一个开源Java API,可以解决动态列问题的JasperReports。

答案 7 :(得分:0)

我猜这个答案来得太晚了,但我把它添加到记录中。在我的情况下,我可以解决它没有任何额外的依赖项或工具。在JRXML文件中,我只是将文本字段宽度添加了多次动态宽度。一旦每个可能的宽度。然后在每个文本字段上,我已经设置它只应在某种情况下打印。

这可能不如动态设置宽度那么优雅,但它可以毫不费力地使用额外的库。