- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有以下AbstractSimpleExpression<Boolean>
为一些文本着色:
private class UtilisationExpression extends AbstractSimpleExpression<Boolean> {
private static final long serialVersionUID = 1L;
private String variableName;
private String fieldName;
public UtilisationExpression(String variableName, String fieldName) {
this.variableName = variableName;
this.fieldName = fieldName;
}
@Override
public Boolean evaluate(ReportParameters reportParameters) {
return ((Double) reportParameters.getVariableValue(variableName)
/ (Double) reportParameters.getFieldValue(fieldName) * 100) > 100;
}
}
文本着色设置如下(initializeStyle()
方法包括此。在其他任何事情之前调用):
conditionalFontColorRedMarketValue = stl
.conditionalStyle(new UtilisationExpression("marketValueSum", "bucket.marketValueLimit"))
.setForegroudColor(Color.RED);
subTotalStyleBottomBordersRightRedColorMarketValue = stl.style(subTotalStyleBottomBordersRight)
.addConditionalStyle(conditionalFontColorRedMarketValue).setLinePen(stl.pen1Point());
subTotalStyleBottomBordersRightRedColorMarketValue.getStyle().getBorder().getBottomPen()
.setLineColor(Color.BLACK);
然后我们在报告中使用它,这有点复杂,因为我使用分组等。我将包含我认为必要的所有内容:
VariableBuilder<Double> valueInEurSumGrp = DynamicReports.variable("marketValueSum", valueInEurColumn,
Calculation.SUM);
CustomGroupBuilder bookGroup = grp.group("bucketGroup", new BucketExpression()).groupByDataType()
.setShowColumnHeaderAndFooter(true).setHeaderLayout(GroupHeaderLayout.VALUE).setPadding(0)
.setStyle(titleStyle).addHeaderComponent(cmp.filler().setFixedHeight(5))
.addFooterComponent(cmp.filler().setFixedHeight(10)).setReprintHeaderOnEachPage(true)
.setMinHeightToStartNewPage(15)
.setPrintSubtotalsWhenExpression(new PrintSubtotalsExpression(valueInEurSumGrp)).keepTogether();
valueInEurSumGrp.setResetGroup(bookGroup);
valueInEurSumGrp.setResetType(Evaluation.GROUP);
FieldBuilder<Double> marketValueLimitField = field("bucket.marketValueLimit", type.doubleType());
// Usage in subtotals
builder.setSubtotalStyle(subTotalStyleNoBordersLeft)
.subtotalsAtGroupFooter(bookGroup,
ReportCommon.createSubtotalColumns(subTotalStyleNoBordersLeft,
ReportCommon.convertSubtotalsToList(
sbt.text("Limit", bookColumn).setStyle(subTotalStyleNoBordersLeft), sbt
.aggregate(marketValueLimitField, valueInEurColumn,
Calculation.NOTHING)
.setStyle(subTotalStyleNoBordersRight).setPattern("#,##0")),
columns.toArray(new TextColumnBuilder<?>[] {})))
.setSubtotalStyle(subTotalStyleBottomBordersLeft)
.subtotalsAtGroupFooter(bookGroup, ReportCommon.createSubtotalColumns(
subTotalStyleBottomBordersLeft,
ReportCommon.convertSubtotalsToList(
sbt.text("Utilisation", bookColumn).setStyle(subTotalStyleBottomBordersLeft),
sbt.aggregate(
new PercentageExpression("bucket.marketValueLimit", valueInEurSumGrp),
valueInEurColumn, Calculation.NOTHING)
.setStyle(subTotalStyleBottomBordersRightRedColorMarketValue)),
columns.toArray(new TextColumnBuilder<?>[] {})))
.addSummary(cmp.filler().setFixedHeight(15));
为了进行比较,PercentageExpression
,它设法计算出正确的百分比:
private class PercentageExpression extends AbstractSimpleExpression<String> {
private static final long serialVersionUID = 1L;
private String fieldName;
private VariableBuilder<Double> valueInEurColumn;
public PercentageExpression(String fieldName, VariableBuilder<Double> valueInEurSum) {
this.fieldName = fieldName;
this.valueInEurColumn = valueInEurSum;
}
@Override
public String evaluate(ReportParameters reportParameters) {
Double percentage = reportParameters.getValue(valueInEurColumn)
/ (double) reportParameters.getFieldValue(fieldName) * 100;
return String.format("%,.2f %%", percentage);
}
}
我省略了一些代码,例如列的初始化和其他样式以及报告本身的很大一部分,因为这与当前的问题无关。
实际问题是 reportParameters.getFieldValue("bucket.marketValueLimit")
在 UtilisationExpression
一旦数据被分组到超过 1 个 block 中,就会获取错误的值。如果我只有 1 个组,它可以正常工作,但一旦我有 2 个或更多组,该方法就无法获取正确的值。
我做了一些代码挖掘,发现错误的方法调用委托(delegate)给 JRAbstractScriptlet#getFieldValue(String fieldName)
。在该方法中,它查看 Map<String,JRFillField> fieldsMap;
其中包含所有字段。然后我找到了我正在搜索的字段并检查了 JRFillField
它包含以下值字段:
private Object previousOldValue;
private Object oldValue;
private Object value;
private Object savedValue;
previousOldValue
和value
是错误的值,而 savedValue
为空且 oldValue
保持我期望的值。在当前组通过小计正确完成之前,似乎已经为下一组设置了值。看来人们实际上可以访问 oldValue
是否可以访问JRFillField
直接,但我也找不到办法做到这一点。
我已经尝试将其设置为 PercentageExpression
(使用 VariableBuilder
),但它具有相同的效果...
有人知道为什么方法调用为每个组返回错误的值吗?我该如何解决这个问题?
<小时/>对于我在这里转储的所有信息感到抱歉,我不确定解决此问题需要什么。如果您需要更多信息,请询问
最佳答案
我找到了解决这个问题的方法。我没有使用 FieldBuilder
,而是从字段创建了 VariableBuilder
并更新了 AbstractSimpleExpression
,如下所示:
@Override
public Boolean evaluate(ReportParameters reportParameters) {
return ((Double) reportParameters.getVariableValue(variableName)
/ (Double) reportParameters.getVariableValue(fieldName) * 100) > 100;
}
设置颜色:
conditionalFontColorRedMarketValue = stl
.conditionalStyle(new UtilisationExpression("marketValueLimit", "bucketMarketValueLimit"))
.setForegroudColor(Color.RED);
conditionalFontColorRedRiskValue = stl
.conditionalStyle(new UtilisationExpression("valueAtRiskLimit", "bucketValueAtRiskLimit"))
.setForegroudColor(Color.RED);
并设置字段/变量:
FieldBuilder<Double> marketValueLimitField = field("bucket.marketValueLimit", type.doubleType());
FieldBuilder<Double> valueAtRiskLimitField = field("bucket.valueAtRiskLimit", type.doubleType());
VariableBuilder<Double> marketValueLimitVariable = DynamicReports.variable("bucketMarketValueLimit",
marketValueLimitField, Calculation.NOTHING);
VariableBuilder<Double> valueAtRiskLimitVariable = DynamicReports.variable("bucketValueAtRiskLimit",
valueAtRiskLimitField, Calculation.NOTHING);
我仍然不确定为什么变量按预期工作而字段却不能按预期工作
关于java - DynamicReports reportParameters.getFieldValue() 返回错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57525452/
我正在尝试使用 DynamicReports 库生成报告。数据源基于具有带参数的 where 子句的 SQL 查询。在下面的示例中,我设置了参数“orderNo=123456”。但是,当我运行查询时,
由于突出显示行时出现一些问题,我在报告中添加了以下列标题: addColumnHeader( cmp.filler().setStyle(stl.style().setTopBorde
我在使用 Jasper Reports 中的 DynamicReports 时遇到字符编码问题。我不知道你应该在哪里指出编码。重音字符有问题。我试过: exporter.setParameter(JR
我正在使用 dynamic-reports基于 Jasper-reports 创建报告。 我遇到了这个奇怪的问题,当我创建包含带有时间戳值的列的报告时,这些值的时间部分被删除并且报告中这些列的值显示时
我尝试使用 DynamicReports 生成动态报告,但总是遇到以下异常,任何人都可以给我解决方案。 Exception in thread "AWT-EventQueue-0" java.lang
我编写了这个管理客户端的应用程序,我使用DynamicReports生成报告。 我在我的应用程序中创建了一个选项,只需按一下按钮即可为每个客户生成报告。 例如:如果我有 5 个客户,我按“生成报告”并
我正在使用动态报告。在他们的网站上http://dynamicreports.sourceforge.net/examples/examples.html我只看到同时出现表格信息和图表的图表示例。 我
我有一个包含类型字段的模型类 ZonedDateTime .生成报表数据时显示为: 2017-08-17T16:09:03+03:00[Europe/Chisinau] 为了格式化该日期,我使用方法
我有一个包含许多目录(超过 200 个)的 Web 应用程序,我想为它们创建 PDF 和 XSL 报告。用户只需按表参数进行过滤。为了创建报告,我正在考虑DynamicReports库。通过网站中的示
我使用DynamicReports库为我的应用程序制作报告。创建报告需要一些时间,我决定在报告尚未创建时创建自定义进度栏。代码示例后的问题。 进度条类: public class ProgressDi
在图中的图表中,我显示了一些产品的销售额的总和。 我现在想要的是创建另一个图表,但要比较不同年份的相同销售额和值(value)。就像这个链接中找到的那样:http://www.dynamicrepor
我正在将现有图像导出到 DynamicReports: public class DReportSample { public DReportSample() { build(
我目前正在为我的项目使用 DynamicReports 构建报告。 由于这是我第一次在 java 中使用此类功能,因此我在执行此操作时遇到了很多问题。 我想做的是动态创建列。我已经解决了 Dynami
我正在使用 DynamicReports API 来构建报告。 我正在设置报告的区域设置并设置报告的日期列的格式,但日期的格式始终如10/12/2009 10:54:44 AM 无论Locale 是什
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 5年前关闭。 Improve t
我有点被这么简单的问题困住了。我正在使用 DynamicReports,如果列值为 null,我想隐藏整行。据我所知,DynamicReports 基于 JasperReports,可以通过选中 Te
我正在使用 DynamicReports 4.0,但在 Excel 中导出数字和小数值时遇到一个问题。这些值以文本格式显示,我需要这些值以数字格式显示,小数点格式为“#,###.##”。 我需要标题中
我有以下AbstractSimpleExpression为一些文本着色: private class UtilisationExpression extends AbstractSimpleExpre
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我需要生成如下所示的报告: 我在 NetBeans 中使用 swing 设计了一个 GUI 来输入详细信息: 我使用 jFreeChart 生成的绘图: JFreeChart chart = Ch
我是一名优秀的程序员,十分优秀!