我正在使用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所有,在此仅作为示例使用。