Jasper reports 在样式中使用conditionalExpression时,如何在JasperReports中获取当前元素?

Jasper reports 在样式中使用conditionalExpression时,如何在JasperReports中获取当前元素?,jasper-reports,Jasper Reports,当单元格的数值小于零时,我想将textValue中的文本设置为红色。目前我的配置如下: <style name="RedText"> <conditionalStyle> <conditionExpression><![CDATA[$F{col1}.compareTo(BigDecimal.ZERO) == -1]]></conditionExpression> <style forecol

当单元格的数值小于零时,我想将textValue中的文本设置为红色。目前我的配置如下:

<style name="RedText">
    <conditionalStyle>
        <conditionExpression><![CDATA[$F{col1}.compareTo(BigDecimal.ZERO) == -1]]></conditionExpression>
        <style forecolor="#FF0000"/>
    </conditionalStyle>
</style>
<style name="ColoredText">
    <conditionalStyle>
        <conditionExpression><![CDATA[(((Integer)$P{STORAGE}.get($P{KEY})) < 0)]]></conditionExpression>
        <style forecolor="blue"/>
    </conditionalStyle>
    <conditionalStyle>
        <conditionExpression><![CDATA[(((Integer)$P{STORAGE}.get($P{KEY})) > 0)]]></conditionExpression>
        <style forecolor="green"/>
    </conditionalStyle>
</style>

我有更多的单元格(col2、col3、col4…)需要应用此红色文本样式。是否可以使其通用于当前值等。col*?

不使用Java代码的标准/经典方法 不使用Java代码是不可能的。在您的情况下,您需要为每个字段创建新样式,并使用conditionExpression包含具体字段值的textField元素应用此具体样式

在常见情况下,textField的表达式可能很复杂,conditionExpression也是如此。样式不知道它属于哪个控件。我们不能使用抽象字段(参数/变量)的值进行操作,引擎需要具体的名称来计算表达式

使用javaapi 是否可以使用JasperReportsJavaAPI解决任务应用风格。例如:

JRDesignStyle boldStyle = new JRDesignStyle();
boldStyle.setName("Sans_Bold");
boldStyle.setFontName("DejaVu Sans");
boldStyle.setFontSize(12);
boldStyle.setBold(true);
// ...
textField.setStyle(boldStyle);
JRDesignExpression expression = new JRDesignExpression();
expression.setText("$F{col1}");
textField.setExpression(expression);
使用后门或“是的,我们喜欢黑客” 看看Java中的beatiful类is Map,它在JasperReports中非常宝贵。它可以帮助我们完成这项任务

  • 我们需要映射类型的参数来存储字段的值(它将是抽象字段-“coln”)
  • 我们需要在解析文本字段的表达式时启用应用样式。属性将有助于启用此功能
  • 我们需要一些Java方法将值放入映射(作为“coln”的存储),该映射返回我们刚才输入的值。这条路不适合这个目的。我使用wrapper over Map.put方法编写了这个小实用程序类
  • 数据源 对于这个例子,使用简单的csv数据源就足够了。我喜欢这种用于测试和调试的数据源

    col1,col2,col3,col4,col5
    1,2,3,9,-5
    -2,6,-3,4,1
    2,-2,-2,7,-3
    8,3,4,-5,6
    
    在下面的示例中,此数据源的数据适配器的名称为numbers.csv。跳过文件的第一行-它包含列的名称

    Java代码 它是一个非常简单的实用程序类

    public class Storage {
    
        public static Integer add(Map<String, Integer> map, String key, Integer value) {
            map.put(key, value);
            return value;
        }
    }
    
    公共类存储{
    公共静态整数添加(映射映射、字符串键、整数值){
    map.put(键、值);
    返回值;
    }
    }
    
    报告模板
  • 应该添加utitlity类的导入以使用它

  • 为了正确解析条件样式的表达式,我们需要在表达式中使用一些参数或变量(您可以查看JasperReports的源代码)。我将添加一些假变量以在conditionExpression中使用

  • 我们需要将“coln”的值放到映射中,然后以条件样式使用该值。在这种情况下,我们不需要知道我们在条件样式中检查的字段的名称。该参数将用于存储地图

  • 我们需要在两次运行中放置并绘制“coln”的值。我们可以使用伪不可见的textField将字段的值放入地图,使用另一个textField应用条件样式显示值。此文本字段的位置和大小相同-一个在另一个之上

  • 我们的情况如下:

    <style name="RedText">
        <conditionalStyle>
            <conditionExpression><![CDATA[$F{col1}.compareTo(BigDecimal.ZERO) == -1]]></conditionExpression>
            <style forecolor="#FF0000"/>
        </conditionalStyle>
    </style>
    
    <style name="ColoredText">
        <conditionalStyle>
            <conditionExpression><![CDATA[(((Integer)$P{STORAGE}.get($P{KEY})) < 0)]]></conditionExpression>
            <style forecolor="blue"/>
        </conditionalStyle>
        <conditionalStyle>
            <conditionExpression><![CDATA[(((Integer)$P{STORAGE}.get($P{KEY})) > 0)]]></conditionExpression>
            <style forecolor="green"/>
        </conditionalStyle>
    </style>
    
    
    0)]]>
    
    conditionExpression中没有字段,它可以工作:)

    jrxml文件:

    
    0) && !“null”.equalsIgnoreCase($V{FAKE})]]>
    
    绿色表示正数,蓝色表示负数。红色用来表示算法的问题

    输出结果 在JRPdfExporter的帮助下生成的pdf:


    不,您不能在jrxml中执行此操作。您可以尝试应用Java代码中的样式。另一种方法-尝试修改JR的源代码,但对我来说很奇怪,这种方式是获取控制数据。我有一个新的想法,如何创建一个黑客。我今晚会检查:)好的,与我们分享这个黑客:)我添加了一个新的“硬黑客”解决方案。我希望你会喜欢:)谢谢,这很有帮助。