我正在使用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)
如果您希望它是动态的,如隐藏/显示新字段,我认为唯一的方法是在运行时修改 jrxml 并编译它。
更新:
要使 JasperReport 在运行时动态化,您可以采用三种方法:
1. 在 iReport 中创建 JRXML
如果您的报表很复杂并且有很多子报表和子数据集,那么最好采用这种方法,因为 iReport 将使您以后的设计和维护更快、更容易。
当采用这种方法时,您将创建 jrxml 文件并将其存储在类路径中,在运行时您将加载该文件,打开它,并修改所需的 XML 标签。我建议从包含最大列数的 jrxml 开始,然后如果用户选择较少的列,则在 jrxml 中找到这些附加列并删除它们。
2. 用 Java 创建整个报告
如果您的报告非常简单,例如快速表格报告,这种方法会更好,在这种情况下您不需要 jrxml 文件,您可以使用 JasperReport 库 API 在运行时从头开始创建整个报告。这种方法将使设计报告变得更加困难,因为在编译和运行之前您不会看到任何内容。更糟糕的是,这是一场维护噩梦。
最终的 Java 源代码将如下所示:“固定列宽测试” 1
3.使用DynamicJasper最后,如果你对新工具持开放态度,那么
DynamicJasper
总是存在的,你也
可以查看在线演示,它非常酷。我把DJ留到最后给大家展示所有的方法,DJ实际上使用的是第二种。动态创建报告的 Java 源代码。
1:固定列宽测试报告版权属于 DynamicJasper,此处仅用作示例。
| 归档时间: |
|
| 查看次数: |
27335 次 |
| 最近记录: |