11

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

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

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

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

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

4

8 回答 8

14

在 jasper 报告的更高版本(v5 或更高版本)中,您可以使用该jr:table组件并真正实现这一点(无需使用 java 代码,就像使用 dynamic-jasper 或 dynamic-reports 一样)。

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

例子

样本数据

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

示例 jrxml

注意:参数$P{displayRecordNumber}<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>

输出 $P{displayRecordNumber}=true

真的

输出 $P{displayRecordNumber}=false

错误的

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

于 2016-04-28T10:22:03.930 回答
4

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

于 2012-09-18T07:32:55.620 回答
2

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

于 2010-08-26T21:25:00.960 回答
1

A slight variation on the "second report" theme that I have used is to isolate the part of the report where you have an optional column into it's own subreport, and then create two subreports, one with and one without the column, and then use conditions to determine which subreport to print.

于 2008-10-01T16:33:46.180 回答
1

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

于 2010-10-08T07:12:34.330 回答
0

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

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

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

于 2008-09-22T21:47:03.190 回答
0

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

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

于 2012-06-11T19:14:44.973 回答
0

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

于 2010-02-02T18:39:45.223 回答