我们有一个由存储过程执行的报告.
我们需要自定义过滤器的报告,过滤后,使用JasperReports报告的数据。我们不能为此使用输入控件,因为它每次都调用存储过程。
是否有这样的机制:在整个报表执行后,将数据集放入堆中,并过滤堆中的数据,并基于筛选器执行报告。
发布于 2016-11-29 22:02:13
实现过滤的方法有几种。
1.使用自定义数据源
您可以获取数据并将其添加到自定义数据源中。例如,可以使用http://jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/data/JRBeanCollectionDataSource.html。
在构建数据源时,可以对数据进行过滤。为了获得新的数据,我们需要用新的数据源生成新的报告。
2.使用filterExpression
可以将filterExpression属性添加到主数据源或subDataset中。此表达式可以帮助以所需的方式筛选数据。
六个值(城市名称)的列表是通过在此示例中包含一些字符进行筛选的:
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Filtering data" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
<subDataset name="ds">
<queryString>
<![CDATA[]]>
</queryString>
<field name="value" class="java.lang.String">
<fieldDescription><![CDATA[_THIS]]></fieldDescription>
</field>
<filterExpression><![CDATA[$F{value}.contains("o")]]></filterExpression>
</subDataset>
<summary>
<band height="15">
<componentElement>
<reportElement x="0" y="0" width="311" height="15"/>
<jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" printOrder="Vertical">
<datasetRun subDataset="ds">
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource(Arrays.asList("Moscow", "London", "Paris", "New York", "Delhi", "Berlin"))]]></dataSourceExpression>
</datasetRun>
<jr:listContents height="15" width="311">
<textField>
<reportElement x="0" y="0" width="311" height="15"/>
<textFieldExpression><![CDATA[$F{value}]]></textFieldExpression>
</textField>
</jr:listContents>
</jr:list>
</componentElement>
</band>
</summary>
</jasperReport>输出在Jaspersoft Studio中的结果

应用筛选器后,只剩下三个值。
这些参数可以在filterExpression.中使用
例如,使用此subDataset (来自上面的示例):
<subDataset name="ds">
<parameter name="filter">
<defaultValueExpression><![CDATA["e"]]></defaultValueExpression>
</parameter>
<field name="value" class="java.lang.String">
<fieldDescription><![CDATA[_THIS]]></fieldDescription>
</field>
<filterExpression><![CDATA[$F{value}.contains($P{filter})]]></filterExpression>
</subDataset>我们得到了这样的结果:

这种过滤方法可以应用于任何数据源。
https://stackoverflow.com/questions/40869539
复制相似问题