【问题标题】:Escape dollar ($) sign in jasper reportjasper 报告中的转义美元 ($) 符号
【发布时间】:2014-02-24 03:06:03
【问题描述】:

我想知道是否有办法在 JasperReport 中转义美元 ($) 符号(我正在使用 Dynamic Jasper)我尝试了 unicode 和 xml 转义,但它不起作用。

我得到这个错误:

1. Syntax error on token "$F", { expected
            value = $F{$}; //$JR_EXPR_ID=13$
                    <>

动态 Jasper 报告代码为:

    drb.setTitle(screenTitleData) 
        .setSubtitle(styledSubTitle)
        .setTitleStyle(titleStyle).setTitleHeight(new Integer(30))
        .setSubtitleHeight(new Integer(20))
        .setDetailHeight(new Integer(8))//defines the height for each record of the report
        .setMargins(margin, margin, margin, margin)
        .setDefaultStyles(titleStyle, null, headerStyle, columDetail)
        .setPrintBackgroundOnOddRows(true)
        .setOddRowBackgroundStyle(oddRowStyle)
        .setColumnsPerPage(new Integer(1))//defines columns per page (like in the telephone guide)
        .setColumnSpace(new Integer(5))
        .setWhenNoData(SwtConstants.DYNAMIC_JASPER_NO_DATA_FOUND, null,true,true)
        .setQuery(queryResult.getExecutedQuery(), DJConstants.QUERY_LANGUAGE_SQL);

如您所见,我正在使用“setQuery”我将列列表保存在一个对象中,因此我浏览列表以使用此代码创建列:

// Varchar columns will not be styled
                abstractColumn = ColumnBuilder.getNew()
                        .setColumnProperty(columns.get(i).getColumnLabel(), String.class.getName())
                        .setTitle(columns.get(i).getColumnLabel()).setWidth(85)
                        .setStyle(commonStyle).setHeaderStyle(headerStyle)
                        .build();

如果您想重现此错误,只需键入如下查询:

Select '$' from dual

请注意,“}”字符也会出现同样的错误。

谁能帮帮我?

【问题讨论】:

  • 您在使用 java 还是 grails?并发布动态jasper的代码。
  • 我刚刚用使用的源代码更新了帖子。是的,我正在使用 java
  • 你的sql查询结果中有$吗?
  • 是的,它在 sql 查询中没有问题,但如果我们使用动态 Jasper 导出它,则会导致此异常。我试图创建一个 JRXML 文件,我注意到 Dynamic Jasper 创建了一个像这样的字段:code 为每一列然后它使用它在像这里 code 这样导致问题的 textFieldExpression 中,我尝试使用“$”或 "\u0024" 但不起作用。

标签: jasper-reports escaping dollar-sign


【解决方案1】:

我找到了解决此问题的方法,我认为这是 Dynamic Jasper 中的一个错误,因为 Jasper 需要将字段完全命名为列名并将此字段用作 TextExpression。

因此,为了避免这样做,我们需要重写此函数并使用 customExpression,因此需要将代码更改为:

                    abstractColumn = ColumnBuilder.getNew()
                        .setColumnProperty(columns.get(i).getColumnLabel(), String.class.getName())
                        .setTitle(columns.get(i).getColumnLabel()).setWidth(85)
                        .setStyle(commonStyle).setHeaderStyle(headerStyle)
                        .setCustomExpression(new CustomExpression() {
                            public Object evaluate(Map fields, Map variables,   Map parameters) {
                                return (String) fields.get(columnName);
                            }

                            public String getClassName() {
                                return String.class.getName();
                            }
                        })
                        .build();

这将解决所有特殊字符的问题。我将向您展示 JRXML 文件的外观,就好像我们进行此修改只是为了理解概念一样:

它将从:

<textFieldExpression><![CDATA[$F{$$}]]>

<textFieldExpression><![CDATA[((ar.com.fdvs.dj.domain.CustomExpression)$P{REPORT_PARAMETERS_MAP}.get("customExpression_for_DJR_3068_COLUMN_1")).evaluate( ((ar.com.fdvs.dj.core.DJDefaultScriptlet)$P{REPORT_SCRIPTLET}).getCurrentFiels(), ((ar.com.fdvs.dj.core.DJDefaultScriptlet)$P{REPORT_SCRIPTLET}).getCurrentVariables(), ((ar.com.fdvs.dj.core.DJDefaultScriptlet)$P{REPORT_SCRIPTLET}).getCurrentParams() )]]></textFieldExpression>
        </textField>

希望这会对某人有所帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-17
    • 2021-07-01
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多