11

特定の条件に基づいて、実行時に列を表示/非表示にしたいと思います。レポートでこの列 (およびヘッダー) を条件付きで表示/非表示にするために、「式を印刷する」を使用しています。列が非表示になると、列が占めていたはずのスペースが空白のままになり、特に魅力的ではありません。

余分なスペースがより効果的な方法で使用された場合、次のような可能性があります。

  • レポートの幅は、非表示の列の幅だけ縮小されます
  • 余分なスペースは残りの列に分配されます

理論的には、列 (​​およびヘッダー) の幅を 0 に設定することで最初のことを達成できますが、内容に合わせて列のサイズを変更する必要があることも示しています。ただし、JasperReports には「コンテンツに合わせて幅を変更する」オプションはありません。

もう 1 つの可能性は、XML でレポート テンプレートを定義する代わりに、Jasper API を使用してレポートを生成することです。しかし、このような単純な要件に対しては、かなりの労力がかかるように思えます。

4

8 に答える 8

14

jasper レポートの新しいバージョン (v5 以降) では、このjr:tableコンポーネントを使用して、これを実際に実現できます (dynamic-jasper または dynamic-reports を使用するように Java コードを使用する必要はありません)。

メソッドは<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 の行が強調表示されています。この行を実際に削除するには、行の一部を共有するすべての要素を null にする必要があります (つまり、出力されません)。

于 2010-08-26T21:25:00.960 に答える
1

私が使用した「2番目のレポート」テーマのわずかなバリエーションは、オプションの列があるレポートの部分を独自のサブレポートに分離し、2つのサブレポートを作成することです。1つは列あり、もう1つは列なしです。印刷するサブレポートを決定するための条件。

于 2008-10-01T16:33:46.180 に答える
1

DynamicReportsを使用することをお勧めします。これはオープン ソースであり、JasperReports に基づいています。このライブラリの主な利点は、動的なレポート デザインであり、視覚的なレポート デザイナーが必要ないことです。

于 2010-10-08T07:12:34.330 に答える
0

これを確認してくださいそのチュートリアルでは、 Velocityフレームワークで XML テンプレートを使用しています。これはかなり複雑です。簡単にするために、DynamicJasperを使用できます。このライブラリは、動的列の問題を解決する JasperReports で動作するオープン ソース Java API です。

于 2010-02-02T18:39:45.223 に答える
0

1 列だけの場合、この列を右端に配置して、print when 式を使用することは可能ですか。そうすれば、真ん中に穴はありません。私はあなたが現在達成しようとしていることを過去にやろうとしたことがあり、私が良い解決策と呼ぶものを見つけることができなかったので、これが理想的ではないことを知っています.

2 番目のアイデアは、列を除いた最初のレポートに基づいて 2 番目のレポートを作成し、レポートを呼び出すときに条件をチェックして、どちらを呼び出すかを決定することです。繰り返しますが、理想的ではありませんが、機能します。

これがあなたが探していた答えではないことはわかっていますが、これらの提案のいずれかがあなたに役立つかもしれません.

于 2008-09-22T21:47:03.190 に答える
0

この答えは遅すぎると思いますが、記録のために追加します。私の場合、追加の依存関係やツールなしで解決できました。JRXML ファイルでは、テキストフィールドの幅を動的な幅に複数回追加しました。可能な幅ごとに1回です。次に、各テキストフィールドで、特定の条件の場合にのみ印刷するように設定しました。

これは幅を動的に設定するほどエレガントではないかもしれませんが、余分なライブラリを使用する手間をかけずにうまくいきます。

于 2012-06-11T19:14:44.973 に答える