jasper-reports – 如何通过jrxml创建动态报告?

我正在研究jrxml来创建动态报告.我已经对列进行了参数化,即该报告的jrxml也可用于生成其他报告.

但是,我还没有设法使这些领域变得灵活.也就是说,如果用户选择4列,它将起作用,但如果选择1或2或3列,则由于字段名称未识别而产生错误.

如果可以创建类似fieldname的默认表达式或者可以使用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所有,此处仅作为样本使用.

点赞