如何通过jrxml创建动态报告?

Sun*_*has 5 jasper-reports

我正在使用jrxml创建动态报告。我已经参数化了列,即该报告的jrxml也可用于生成其他报告。

但是,我没有设法使字段灵活。也就是说,如果用户选择4列,则可以使用,但是如果选择1或2或3列,则由于字段名未标识,因此会出现错误。

如果可以为字段名创建默认表达式或可以使用for循环/ java脚本,请紧急发布解决方案。

此外,如何更准确地利用碧玉设计师实现这一目标?

jrxml如下:

<?xml version="1.0"?>
<!DOCTYPE jasperReport
  PUBLIC "-//JasperReports//DTD Report Design//EN"
  "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<jasperReport name="report1">
    <parameter name="reportTitle" class="java.lang.String"/>
    <parameter name="author" class="java.lang.String"/>
    <parameter name="startDate" class="java.lang.String"/>

    <parameter name="C1" class="java.lang.String">
        <defaultValueExpression>
            new java.lang.String("")
        </defaultValueExpression>
    </parameter>
    <parameter name="C2" class="java.lang.String">
        <defaultValueExpression>
            new java.lang.String("")
        </defaultValueExpression>
    </parameter>
    <parameter name="C3" class="java.lang.String">
        <defaultValueExpression>
            new java.lang.String("")
        </defaultValueExpression>
    </parameter>
    <parameter name="C4" class="java.lang.String">
        <defaultValueExpression>
            new java.lang.String("default parameter value")
        </defaultValueExpression>
    </parameter>

    <field name="COLUMN_1" class="java.lang.Integer"/>
    <field name="COLUMN_2" class="java.lang.Integer"/>
    <field name="COLUMN_3" class="java.lang.Integer"/>
    <field name="COLUMN_4" class="java.lang.Integer"/>

    <title>
        <band height="60">
            <textField>
                <reportElement x="0" y="10" width="500" height="40"/>
                <textElement textAlignment="Center">
                    <font size="24"/>
                </textElement>
                <textFieldExpression class="java.lang.String">
                    <![CDATA[$P{reportTitle}]]>
                </textFieldExpression>
            </textField>
            <textField>
                <reportElement x="0" y="40" width="500" height="20"/>
                <textElement textAlignment="Center"/>
                <textFieldExpression class="java.lang.String">
                    <![CDATA["Run by: " + $P{author}
                        + " on " + $P{startDate}]]>
                </textFieldExpression>
            </textField>
        </band>
    </title>

    <columnHeader>
        <band height="30">
            <rectangle>
                <reportElement x="0" y="0" width="500" height="25"/>
                <graphicElement/>
            </rectangle>

            <textField>
                <reportElement x="0" y="5" width="170" height="15"/>
                <textFieldExpression class="java.lang.String">
                    <![CDATA[$P{C1}]]>
                </textFieldExpression>
            </textField>

            <textField>
                <reportElement x="70" y="5" width="170" height="15"/>
                <textFieldExpression class="java.lang.String">
                    <![CDATA[$P{C2}]]>
                </textFieldExpression>
            </textField>

            <textField>
                <reportElement x="150" y="5" width="150" height="15"/>
                <textFieldExpression class="java.lang.String">
                    <![CDATA[$P{C3}]]>
                </textFieldExpression>
            </textField>

            <textField>
                <reportElement x="300" y="5" width="150" height="15"/>
                <textFieldExpression class="java.lang.String">
                    <![CDATA[$P{C4}]]>
                </textFieldExpression>
            </textField>
        </band>
    </columnHeader>

    <detail>
        <band height="20">
            <textField>
                <reportElement x="5" y="0" width="50" height="15"/>
                <textElement/>
                <textFieldExpression class="java.lang.Integer">
                    <![CDATA[$F{COLUMN_1}]]>
                </textFieldExpression>
            </textField>

            <textField>
                <reportElement x="90" y="0" width="150" height="15"/>
                <textElement/>
                <textFieldExpression class="java.lang.Integer">
                    <![CDATA[$F{COLUMN_2}]]>
                </textFieldExpression>
            </textField>

            <textField>
                <reportElement x="170" y="0" width="50" height="15"/>
                <textElement/>
                <textFieldExpression class="java.lang.Integer">
                    <![CDATA[$F{COLUMN_3}]]>
                </textFieldExpression>
            </textField>

            <textField>
                <reportElement x="320" y="0" width="150" height="15"/>
                <textElement/>
                <textFieldExpression class="java.lang.Integer">
                    <![CDATA[$F{COLUMN_4}]]>
                </textFieldExpression>
            </textField>
        </band>
    </detail>
</jasperReport>
Run Code Online (Sandbox Code Playgroud)

med*_*pal 3

如果您希望它是动态的,如隐藏/显示新字段,我认为唯一的方法是在运行时修改 jrxml 并编译它。

更新:

要使 JasperReport 在运行时动态化,您可以采用三种方法:

1. 在 iReport 中创建 JRXML
如果您的报表很复杂并且有很多子报表和子数据集,那么最好采用这种方法,因为 iReport 将使您以后的设计和维护更快、更容易。
当采用这种方法时,您将创建 jrxml 文件并将其存储在类路径中,在运行时您将加载该文件,打开它,并修改所需的 XML 标签。我建议从包含最大列数的 jrxml 开始,然后如果用户选择较少的列,则在 jrxml 中找到这些附加列并删除它们。

2. 用 Ja​​va 创建整个报告
如果您的报告非常简单,例如快速表格报告,这种方法会更好,在这种情况下您不需要 jrxml 文件,您可以使用 JasperReport 库 API 在运行时从头开始创建整个报告。这种方法将使设计报告变得更加困难,因为在编译和运行之前您不会看到任何内容。更糟糕的是,这是一场维护噩梦。
最终的 Java 源代码将如下所示:“固定列宽测试” 1

3.使用DynamicJasper最后,如果你对新工具持开放态度,那么 DynamicJasper
总是存在的,你也 可以查看在线演示,它非常酷。我把DJ留到最后给大家展示所有的方法,DJ实际上使用的是第二种。动态创建报告的 Java 源代码。


1:固定列宽测试报告版权属于 DynamicJasper,此处仅用作示例。