我使用的textField溢出,相对于我想在pageFooter中添加脚注的textField。
仅当页面包含我的textField时,才需要在pageFooter中打印文本,或者至少在页面包含它时使页脚显示。
例:
我在.jrxml中有一个名为“ Witnesseth”和“ Section A”的部分,如下所示:
现在,这个见证人可能太长了,由于篇幅太长,可以移到下一页。
我有一个带有脚注的页脚,如下所示:
当前它出现在每个页面上,但我只希望它出现在A部分的打印位置。
最佳答案
如果您不愿意发布详细的结果(这也不简单),则在jasper-reports中创建脚注有两个主要挑战:
当textField溢出时,它将在哪个页面上开始/结束?
仅通过分组或使用不同的详细信息带,您就可以轻松掌握textField
将在哪个页面上开始的信息。pageFooter
是固定大小的(无法动态缩放)
您需要预先定义脚注的空间,在某些有限的情况下,可以使用可以动态缩放的groupFooter带,但这些情况是有限的。
考虑到这没有处理脚注的“最终”解决方案,我将向大家展示一个简单案例的解决方案。
我们的局限性在于,相对于textField的脚注将位于
textField开始的页面,此外,
pageFooter仅允许最多3个脚注x页面(这是我的预定义空间)。请注意,它将
通过添加伪造的文字在页面上以文本字段结尾的脚注很容易
新细节区域中的textField。
这个想法是使用一个简单的JRScriplet
,当在textField上调用printWhenExpression
时将收集数据(它可能被调用了几次,所以我们需要处理它)。在pageFooter
中,我们将请求收集的数据来生成脚注列表。
例
JRScriplet,我们将调用addFootnote
添加注释,并调用getFootnoteDatasource
打印当前脚注。
public class FootnoteScriplet extends JRDefaultScriptlet {
//Distinct ordered values (since jasper may call more then once)
private TreeSet<String> footNotes;
public FootnoteScriplet(){
super();
this.footNotes = new TreeSet<>();
}
/**
* Add a footnote
* @param footNote, string of footNote
* @return always <code>true</true> since we use in printWhenExpression
*/
public boolean addFootnote(String footNote){
this.footNotes.add(footNote);
return true;
}
/**
* Get the datasource for footNotes and clear for future use.
* @return
*/
public JRDataSource getFootnoteDatasource(){
JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(new ArrayList<>(footNotes));
this.footNotes.clear();
return ds;
}
}
jrxml,使用OnEmptyRecord数据源运行以进行测试,其结构是使用多个明细带,在textField的
printWhenExpression
(始终返回true
)中调用我们的脚本,以添加脚注,然后使用jr:list
组件显示收集的脚注在pageFooter
中。<?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="Footnotes" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" scriptletClass="my.package.FootnoteScriplet" uuid="b5b15f62-e36a-4c91-a871-ea43faa7d0af">
<subDataset name="footNoteDS" uuid="884dba42-5c44-4049-a50a-b7e13cc47607">
<queryString>
<![CDATA[]]>
</queryString>
<field name="_THIS" class="java.lang.String"/>
</subDataset>
<parameter name="TEXT" class="java.lang.String">
<defaultValueExpression><![CDATA["Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?"]]></defaultValueExpression>
</parameter>
<queryString>
<![CDATA[]]>
</queryString>
<group name="TEXT2" footerPosition="CollateAtBottom">
<groupExpression><![CDATA["2"]]></groupExpression>
</group>
<detail>
<band height="50">
<textField isStretchWithOverflow="true">
<reportElement x="0" y="0" width="550" height="16" isRemoveLineWhenBlank="true" uuid="8def1808-b5c0-45b6-943f-8a88ec04f02b">
<printWhenExpression><![CDATA[$P{REPORT_SCRIPTLET}.addFootnote("Footnote 1")]]></printWhenExpression>
</reportElement>
<textElement>
<font size="12"/>
</textElement>
<textFieldExpression><![CDATA["(1)" + $P{TEXT} + "\n" + $P{TEXT}]]></textFieldExpression>
</textField>
</band>
<band height="50">
<textField isStretchWithOverflow="true">
<reportElement positionType="Float" x="0" y="0" width="550" height="16" uuid="b6faedf8-11d8-45c8-ac46-e3fb95106140">
<printWhenExpression><![CDATA[$P{REPORT_SCRIPTLET}.addFootnote("Footnote 2")]]></printWhenExpression>
</reportElement>
<textElement>
<font size="12"/>
</textElement>
<textFieldExpression><![CDATA["(2)" + $P{TEXT} + "\n" + $P{TEXT}]]></textFieldExpression>
</textField>
</band>
<band height="50">
<textField isStretchWithOverflow="true">
<reportElement positionType="Float" x="0" y="0" width="550" height="16" uuid="2db72e84-3e07-4e38-b2bb-c172bbd30956">
<printWhenExpression><![CDATA[$P{REPORT_SCRIPTLET}.addFootnote("Footnote 3")]]></printWhenExpression>
</reportElement>
<textElement>
<font size="12"/>
</textElement>
<textFieldExpression><![CDATA["(3)" + $P{TEXT} + "\n" + $P{TEXT}]]></textFieldExpression>
</textField>
</band>
<band height="50">
<textField isStretchWithOverflow="true">
<reportElement positionType="Float" x="0" y="0" width="550" height="16" uuid="4e4b4f2f-4279-4c21-8f0d-62ba92760edd">
<printWhenExpression><![CDATA[$P{REPORT_SCRIPTLET}.addFootnote("Footnote 4")]]></printWhenExpression>
</reportElement>
<textElement>
<font size="12"/>
</textElement>
<textFieldExpression><![CDATA["(4)" + $P{TEXT} + "\n" + $P{TEXT}]]></textFieldExpression>
</textField>
</band>
<band height="50">
<textField isStretchWithOverflow="true">
<reportElement positionType="Float" x="0" y="0" width="550" height="16" uuid="5552de59-29f3-49e7-87aa-ee75b811739d">
<property name="footNote" value=""FootNote 5""/>
<printWhenExpression><![CDATA[$P{REPORT_SCRIPTLET}.addFootnote("Footnote 5")]]></printWhenExpression>
</reportElement>
<textElement>
<font size="12"/>
</textElement>
<textFieldExpression><![CDATA["(5)" + $P{TEXT} + "\n" + $P{TEXT}]]></textFieldExpression>
</textField>
</band>
</detail>
<pageFooter>
<band height="64">
<line>
<reportElement x="13" y="5" width="534" height="1" uuid="c5b242d5-cafa-43ed-9536-391a4728edf6"/>
<graphicElement>
<pen lineWidth="0.25" lineStyle="Solid"/>
</graphicElement>
</line>
<componentElement>
<reportElement positionType="Float" x="11" y="10" width="470" height="16" uuid="08bbac11-4f61-4858-8d82-639875dfe1c7"/>
<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="footNoteDS" uuid="c10d3aaf-8109-4f5b-8099-40450ea9ad7e">
<dataSourceExpression><![CDATA[$P{REPORT_SCRIPTLET}.getFootnoteDatasource()]]></dataSourceExpression>
</datasetRun>
<jr:listContents height="16" width="470">
<textField>
<reportElement x="0" y="0" width="470" height="16" uuid="d6b5f278-02eb-43d0-934e-5282d37950f5"/>
<textElement verticalAlignment="Middle"/>
<textFieldExpression><![CDATA[$F{_THIS}]]></textFieldExpression>
</textField>
</jr:listContents>
</jr:list>
</componentElement>
<textField>
<reportElement positionType="FixRelativeToBottom" x="500" y="44" width="50" height="20" uuid="7e4a61be-7f67-4003-bd6e-1417cd77378b"/>
<textElement textAlignment="Right" verticalAlignment="Middle"/>
<textFieldExpression><![CDATA["P." + $V{PAGE_NUMBER}]]></textFieldExpression>
</textField>
</band>
</pageFooter>
</jasperReport>
输出量
这不是最终的解决方案,而是答案是要演示与脚注有关的问题,并给出如何处理它们的初步思路。