我正在使用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>

最佳答案

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

更新:

为了使JasperReport在运行时动态,您可以采用以下三种方法:

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

2.用Java创建整个报告
如果您的报表非常简单(例如快速表格报表),那么这种方法会更好,在这种情况下,您不需要jrxml文件,则可以使用JasperReport库API在运行时从头创建整个报表。这种方法将使设计报告更加困难,因为在编译和运行之前您将看不到任何东西。更糟糕的是它的维护噩梦。
您最终的Java源代码将如下所示:"Fixed Column Width Test" 1

3.使用DynamicJasper
最后,如果您愿意使用新工具,那么总会有DynamicJasper,您也可以检查online demo,它很酷。
最后,我将DJ展示给您看所有方法,DJ实际上使用了第二种方法。动态创建报告的Java源代码。



1:固定列宽测试报告的版权归DynamicJasper所有,在此仅作为示例使用。

09-16 06:40