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

Posted

技术标签:

【中文标题】如何在运行时显示/隐藏列?【英文标题】:How to show/hide a column at runtime? 【发布时间】:2010-09-12 01:51:18 【问题描述】:

我想根据特定条件在运行时显示/隐藏列。我正在使用“Print when expression”在我的报告中有条件地显示/隐藏此列(及其标题)。当该列被隐藏时,它本来占用的空间是空白的,这不是特别吸引人。

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

报表的宽度减少了隐藏列的宽度 多余的空间分布在剩余的列中

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

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

【问题讨论】:

【参考方案1】:

在 jasper 报告的更高版本(v5 或更高版本)中,您可以使用jr:table 组件并真正实现这一点(不使用 java 代码作为使用 dynamic-jasper 或 dynamic-reports) .

方法是在<jr:column/>下使用<printWhenExpression/>

示例

样本数据

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

jrxml 示例

注意:参数$PdisplayRecordNumber和第一个jr:column下的<printWhenExpression>

<?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 >
            <componentElement>
                <reportElement key="table" style="table" x="0" y="0"   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[$PREPORT_DATA_SOURCE]]></dataSourceExpression>
                    </datasetRun>
                    <jr:column  uuid="918270fe-25c8-4a9b-a872-91299cddbc31">
                        <printWhenExpression><![CDATA[$PdisplayRecordNumber]]></printWhenExpression>
                        <jr:columnHeader style="table_CH"  rowSpan="1">
                            <staticText>
                                <reportElement x="0" y="0"   uuid="5cd6da41-01d5-4f74-99c2-06784f891d1e"/>
                                <textElement textAlignment="Center" verticalAlignment="Middle"/>
                                <text><![CDATA[Record number]]></text>
                            </staticText>
                        </jr:columnHeader>
                        <jr:detailCell style="table_TD"  rowSpan="1">
                            <textField>
                                <reportElement x="0" y="0"   uuid="5fe48359-0e7e-44b2-93ac-f55404189832"/>
                                <textElement textAlignment="Center" verticalAlignment="Middle"/>
                                <textFieldExpression><![CDATA[$VREPORT_COUNT]]></textFieldExpression>
                            </textField>
                        </jr:detailCell>
                    </jr:column>
                    <jr:column  uuid="7979d8a2-4e3c-42a7-9ff9-86f8e0b164bc">
                        <jr:columnHeader style="table_CH"  rowSpan="1">
                            <staticText>
                                <reportElement x="0" y="0"   uuid="61d5f1b6-7677-4511-a10c-1fb8a56a4b2a"/>
                                <textElement textAlignment="Center" verticalAlignment="Middle"/>
                                <text><![CDATA[Username]]></text>
                            </staticText>
                        </jr:columnHeader>
                        <jr:detailCell style="table_TD"  rowSpan="1">
                            <textField>
                                <reportElement x="0" y="0"   uuid="a3cdb99d-3bf6-4c66-b50c-259b9aabfaef"/>
                                <box leftPadding="3" rightPadding="3"/>
                                <textElement verticalAlignment="Middle"/>
                                <textFieldExpression><![CDATA[$FUser]]></textFieldExpression>
                            </textField>
                        </jr:detailCell>
                    </jr:column>
                    <jr:column  uuid="625e4e5e-5057-4eab-b4a9-c5b22844d25c">
                        <jr:columnHeader style="table_CH"  rowSpan="1">
                            <staticText>
                                <reportElement x="0" y="0"   uuid="e1c07cb8-a44c-4a8d-8566-5c86d6671282"/>
                                <textElement textAlignment="Center" verticalAlignment="Middle"/>
                                <text><![CDATA[Reputation]]></text>
                            </staticText>
                        </jr:columnHeader>
                        <jr:detailCell style="table_TD"  rowSpan="1">
                            <textField pattern="#,##0">
                                <reportElement x="0" y="0"   uuid="6be2d79f-be82-4c7b-afd9-0039fb8b3189"/>
                                <box leftPadding="3" rightPadding="3"/>
                                <textElement textAlignment="Right" verticalAlignment="Middle"/>
                                <textFieldExpression><![CDATA[$FRep]]></textFieldExpression>
                            </textField>
                        </jr:detailCell>
                    </jr:column>
                </jr:table>
            </componentElement>
        </band>
    </title>
</jasperReport>

$PdisplayRecordNumber=true 的输出

$PdisplayRecordNumber=false 的输出

如您所见,列在显示的基础上很好地适应了。

【讨论】:

这是一个采用类似方法的视频教程:youtube.com/watch?v=Bmrqo9fDkOs【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

Remove line when blank - 问题是如何隐藏列,而不是行【参考方案4】:

我使用的“第二个报告”主题的一个细微变化是将报告中您有一个可选列的部分隔离到它自己的子报告中,然后创建两个子报告,一个有列,一个没有列,然后使用条件来确定要打印哪个子报表。

【讨论】:

【参考方案5】:

我推荐使用DynamicReports,它是开源的并且基于JasperReports。 这个库的主要好处是动态报表设计,不需要可视报表设计器。

【讨论】:

【参考方案6】:

如果只是一列,是否可以把这一列放在最右边,然后使用print when 表达式。这样中间就没有洞了。我知道这并不理想,因为我过去曾尝试过您目前正在尝试完成的事情,但找不到我所说的好的解决方案。

第二个想法是基于第一个不带列的报告创建第二个报告,然后在调用报告时检查条件,以决定调用哪个报告。再次不理想,但会工作。

我知道这并不是您真正想要的答案,但其中一个建议可能对您有用。

【讨论】:

第一个解决方案不会真正起作用,因为有多个列并且报表标题上有背景颜色,所以如果缺少列,它仍然会看起来很奇怪。第二种解决方案涉及复制报告,这是我试图避免的问题:) 无论如何谢谢!【参考方案7】:

检查THIS 在该教程中,他们使用 XML 模板和 Velocity 框架。这是相当复杂的。为了更简单,您可以联系我们DynamicJasper。该库是一个开源 Java API,可在 JasperReports 上运行,解决动态列问题。

【讨论】:

【参考方案8】:

我想这个答案来得太晚了,但我将其添加为记录。就我而言,我可以在没有任何额外依赖项或工具的情况下解决它。在 JRXML 文件中,我只是多次将文本字段宽度添加为动态宽度。每个可能的宽度一次。然后在每个文本字段上,我设置它只应在特定条件下打印。

这可能不如动态设置宽度那么优雅,但它可以解决问题,而无需使用额外的库。

【讨论】:

以上是关于如何在运行时显示/隐藏列?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QTabWidget 中隐藏选项卡并在按下按钮时显示它

如何默认隐藏键盘并仅在单击 EditText 时显示 [重复]

如何在鼠标悬停时显示隐藏的 div?

如何使用 useState 在点击时显示/隐藏移动导航栏? React + TypeScript + Tailwind 项目

如何在用户注销时隐藏侧边栏并在用户登录时显示侧边栏?

当用户放大 UIScrollView 时如何隐藏某些内容,然后在缩小时显示它?