Jasper reports 在样式中使用conditionalExpression时,如何在JasperReports中获取当前元素?
当单元格的数值小于零时,我想将textValue中的文本设置为红色。目前我的配置如下:Jasper reports 在样式中使用conditionalExpression时,如何在JasperReports中获取当前元素?,jasper-reports,Jasper Reports,当单元格的数值小于零时,我想将textValue中的文本设置为红色。目前我的配置如下: <style name="RedText"> <conditionalStyle> <conditionExpression><![CDATA[$F{col1}.compareTo(BigDecimal.ZERO) == -1]]></conditionExpression> <style forecol
<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中非常宝贵。它可以帮助我们完成这项任务
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(键、值);
返回值;
}
}
报告模板
<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的源代码,但对我来说很奇怪,这种方式是获取控制数据。我有一个新的想法,如何创建一个黑客。我今晚会检查:)好的,与我们分享这个黑客:)我添加了一个新的“硬黑客”解决方案。我希望你会喜欢:)谢谢,这很有帮助。