【问题标题】:Adding FilterExpression in JasperReports with help of Java code借助 Java 代码在 JasperReports 中添加 FilterExpression
【发布时间】:2016-07-28 07:37:24
【问题描述】:

我正在用 Java 开发一个工具,可以在 JasperReports 中进行一些自动化操作(自动打印、设置参数等)。我主要使用 JasperReport 库。现在我必须使用 Java 代码设置过滤器表达式。我知道如何准备参数,我是这样做的:

Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("filter", "where name like '%.'");

然后,我在生成 PDF 报告时传递了这个参数:

JasperPrint pdf = JasperFillManager.fillReport(jasperReport, parameters, connection);

如果有这么简单的修改参数的方法,我想也有类似的修改过滤器表达式的方法。我已经搜索了很长时间,但我什么也没找到。

【问题讨论】:

  • I need to add new Filter Expression to my Jasper report using Java code. - 什么意思?
  • 您可以手动将过滤器表达式添加到您的报告中。例如这样的:$F{NAME}.contains( "USP") ||$F{NAME}.contains("O")。在报告源中,它看起来像这样:&lt;filterExpression&gt;&lt;![CDATA[$F{NAME}.contains( "USP" )|| $F{NAME}.contains("O")]]&gt;&lt;/filterExpression&gt; 我的工作是在 java 代码中设置这些条件
  • 你在考虑基于 JavaBean 的数据源吗?
  • 没错,我的意思是 JasperReport 库。我想如果我可以使用这个库设置参数,还有设置过滤器表达式的选项,但我不知道如何。任何方法都可以是好的,但前提是它可以自动完成(使用代码)
  • 您可以过滤集合,例如在 Guava 的帮助下:Filtering a list of JavaBeans with Google Guava 或使用 Stream API:Java 8 Lambda filter by Lists

标签: java jasper-reports


【解决方案1】:

由于您使用的是数据库连接,因此我看不出没有更好的方法来过滤查询。

这限制了需要从数据库传输和迭代的数据,从而提高了性能并减少了内存使用量。

注意,您正在使用 $P!() 传递整个查询,我可能更愿意使用准备好的语句仅传递值并使用 $P() 在 jasper 报告表达式中设置查询以了解差异,请参阅 JasperReports: Passing parameters to query

如果您无法在查询中过滤,另一种解决方案是将数据加载到 bean 中,过滤它然后将结果 List 作为 JRBeanCollectionDataSource 传递

【讨论】:

    【解决方案2】:

    报告过滤器表达式(或任何其他表达式)只能在JasperDesign 对象中设置/更改(请参阅setFilterExpression 方法)。 JasperDesign 对象必须重新编译成 JasperReport

    过滤器表达式的替代方法是JRParameter.FILTER 内置参数,它采用net.sf.jasperreports.engine.DatasetFilter 实例作为值。 JasperReports 包含一个名为 FieldFilterDatasetFilter 实现,它在内部用于交互式过滤,但它可能不适合您的需求,在这种情况下,您需要编写自己的 DatasetFilter 实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-06
      • 1970-01-01
      相关资源
      最近更新 更多