我在 JasperReports jrxml 的 详细信息 部分中有以下报告。
这是我从 Java 获得的列表,其中包含 2 个对象,两个对象都在第一页上输出,因此每次调用测试变量时。
<detail>
<band height="200" splitType="Stretch">
<componentElement>
<reportElement key="table" style="table" x="0" y="49" width="500" height="140"/>
<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">
<datasetRun subDataset="Data Set">
<datasetParameter name="REPORT_DATA_SOURCE">
<datasetParameterExpression><![CDATA[$P{REPORT_DATA_SOURCE}]]></datasetParameterExpression>
</datasetParameter>
</datasetRun>
<jr:listContents height="50" >
<textField isBlankWhenNull="true">
<reportElement x="0" y="0" width="200" height="20" isRemoveLineWhenBlank="true"/>
<textElement textAlignment="Left" verticalAlignment="Middle" >
<font size="10" fontName="DejaVu Serif" isBold='true'/>
</textElement>
<textFieldExpression><![CDATA[$F{test}]]></textFieldExpression>
</textField>
</jr:listContents>
</jr:list>
</componentElement>
</band>
</detail>
所以我有一个包含 2 个对象的列表,即 beans。一切正常,但此测试变量在每个页面上显示两次(两个对象都在第一页上调用),而不是每页一个对象。我想在打印第一个测试后休息一下,以便列表中的下一个测试打印在下一页上。
有人能指出我正确的方向吗?
最佳答案
我有答案,如果其他人也有同样的问题,我会将其发布在这里。
Jasper 报告有很多错误。首先,当您打印出元素(对象)的集合时,您将集合发送到 jasper 引擎,由于某种未知的原因,该引擎无法识别集合中的第一个元素。您可以通过在集合的索引 0 上添加一个虚拟对象来解决此问题。
经过搜索,我发现jasper API有getPages()函数。这将返回列表中将打印的页数。列表的每个索引都是一页。当您填写报告时,您可以从这个 jasperPrint 调用此函数。
JasperReport jasperReport = null;
JasperPrint jasperPrint = null;
其中 ist 是 jrxml 的输入流,parameters 是 HashMap ,最后是 jRBeancollData 源列表。
beanColDataSource = new JRBeanCollectionDataSource("YOURLIST");
jasperReport = JasperCompileManager.compileReport(ist);
jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, beanColDataSource);
List<JRPrintPage> pages = japserPrint.getPages();
有了这个jasperPrint之后,你就可以调用我写的这个函数了。
/**
* This removes blank page if the page size is bigger then the number of
* "pages" in array if for some reason we get last page as empty in pdf - we
* also put arraySize - 1 since we ve put one dummy(empty) in the array
* collection on index 0 since for some buggy unknown reason jasper always
* outputs collections from index 1 forward instead of 0.
*
* @author Uros
* @param pages
* , arraySize
*/
private void removeBlankPage(List<JRPrintPage> pages, int arraySize)
{
int numOfPages = pages.size();
if (numOfPages > arraySize - 1)
{
pages.remove(numOfPages - 1);
}
}
本例中的函数仅删除最后一页,您可以对其进行修改,以便删除任何其他空页(如果有),并且由于您放入了 1 个虚拟,因此 arraySize 较小。 由于您在每一页上打印每个对象,因此如果页面数量多于对象,则显然有一个空白页,因此您将其删除。当然,您需要确保数据不会延伸到下一页,但我打印的页面始终看起来相同。
希望有帮助..
关于list - JasperReports列表+新页每条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19426740/