gpt4 book ai didi

jasper-reports - 仅在首页上打印页脚

转载 作者:行者123 更新时间:2023-12-04 04:12:38 30 4
gpt4 key购买 nike

我想只在jasper报告的首页上显示页脚。

在搜索了论坛之后,我在这里看到了这个问题的询问,并多次回答不当。正如许多人所建议的那样,我尝试在页脚区域中的表达式中放置一个打印文字,以防止在不是第一页的情况下打印该文字:

new Boolean($V{PAGE_NUMBER}.intValue() == 1)

但是,这不起作用。结果是页脚的所有属性都不会打印,但是页脚块仍会打印并占用空间,从而导致细节无法使用整个页面。实际上,您在第一页上有一个包含数据的页脚,在随后的每一页上都没有数据的页脚。

有谁知道如何使这项工作真正有效的窍门?

最佳答案

显然,至少在当前版本的Jasper库可用的情况下,似乎并没有直接的方法来实现它。但是,这是一个非常粗糙的解决方法,在类似的要求下对我们有用。今天早上,我仅将代码的页脚管理部分分离到一个示例项目中,并且工作正常。
注意:

  • 不确定这是否适用于复杂的报告(尤其是是否需要打印column-footer,因为我们手动修改了columnFooterOffsetY值)。我们必须生成一个仅包含标题,详细信息和页脚区域的简单报告。
  • 重要的是,我不建议针对复杂的需求使用此解决方案,因为从长期来看,它可能会引起可维护性问题(尤其是如果将来将来迁移到jasperreports库的更高版本,这可能会修改报告填充逻辑)。
  • 我已经使用JasperReports库版本5.0.0进行了测试。

  • 示例的构建方式:
  • 使用iReport创建了JRXML,并使用printwhen表达new Boolean($V{PAGE_NUMBER}.intValue() == 1来表示页脚区域。
  • 创建了一个Custom报告填充器实例,扩展了JRVerticalFiller类。

  • 使用的示例源XML:(向XML添加其他行,以便报表可以包装到多个页面)
    <?xml version="1.0" encoding="UTF-8"?>

    <employees>
    <employee id="1001" name="AAA" email="aaa@somecorp.com" salary="20500.125"/>
    <employee id="1002" name="BBB" email="bbb@somecorp.com" salary="10000.500"/>
    <employee id="1003" name="CCC" email="ccc@somecorp.com" salary="12275.750"/>
    <employee id="1004" name="DDD" email="ddd@somecorp.com" salary="10750.750"/>
    </employees>
    使用iReport创建的JRXML(页脚区域的表达式为printwhen):
    <?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="jr_footer_display_test" pageWidth="792" pageHeight="288" orientation="Landscape" columnWidth="752" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="27ac3ae2-27da-484b-b088-b4d79aa973cc">
    <property name="ireport.zoom" value="1.0"/>
    <property name="ireport.x" value="0"/>
    <property name="ireport.y" value="0"/>
    <queryString language="xPath">
    <![CDATA[//employee]]>
    </queryString>
    <field name="email" class="java.lang.String">
    <fieldDescription><![CDATA[./@email]]></fieldDescription>
    </field>
    <field name="id" class="java.lang.String">
    <fieldDescription><![CDATA[./@id]]></fieldDescription>
    </field>
    <field name="name" class="java.lang.String">
    <fieldDescription><![CDATA[./@name]]></fieldDescription>
    </field>
    <field name="salary" class="java.lang.String">
    <fieldDescription><![CDATA[./@salary]]></fieldDescription>
    </field>
    <background>
    <band splitType="Stretch"/>
    </background>
    <columnHeader>
    <band height="50">
    <staticText>
    <reportElement uuid="c3d42e71-672e-402f-9fbb-4889be2a269b" x="29" y="2" width="100" height="20"/>
    <textElement/>
    <text><![CDATA[ID]]></text>
    </staticText>
    <staticText>
    <reportElement uuid="a4c42dc4-4276-485a-b5a6-b4e6bd2bc217" x="136" y="2" width="100" height="20"/>
    <textElement/>
    <text><![CDATA[Name]]></text>
    </staticText>
    <staticText>
    <reportElement uuid="157e527b-7ad5-46bf-a06d-2fa0a2686b1e" x="253" y="2" width="100" height="20"/>
    <textElement/>
    <text><![CDATA[Email]]></text>
    </staticText>
    <staticText>
    <reportElement uuid="4d87c542-7057-4bc1-9a7e-fbd6a554f33a" x="386" y="2" width="100" height="20"/>
    <textElement/>
    <text><![CDATA[Salary]]></text>
    </staticText>
    </band>
    </columnHeader>
    <detail>
    <band height="21" splitType="Stretch">
    <textField>
    <reportElement uuid="31d09543-a128-469a-be38-3d8987ba781b" x="29" y="0" width="100" height="20"/>
    <textElement/>
    <textFieldExpression><![CDATA[$F{id}]]></textFieldExpression>
    </textField>
    <textField>
    <reportElement uuid="ce5c11f8-68da-4efd-93fa-e1f1b5ce407f" x="136" y="0" width="100" height="20"/>
    <textElement/>
    <textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
    </textField>
    <textField>
    <reportElement uuid="300dcc3b-8a2a-489d-8518-7283c95b2f88" x="253" y="0" width="100" height="20"/>
    <textElement/>
    <textFieldExpression><![CDATA[$F{email}]]></textFieldExpression>
    </textField>
    <textField>
    <reportElement uuid="a37f2df9-2459-446d-bc47-488a336aa60e" x="386" y="0" width="100" height="20"/>
    <textElement/>
    <textFieldExpression><![CDATA[$F{salary}]]></textFieldExpression>
    </textField>
    </band>
    </detail>
    <pageFooter>
    <band height="40" splitType="Stretch">
    <printWhenExpression><![CDATA[new Boolean($V{PAGE_NUMBER}.intValue() == 1)]]></printWhenExpression>
    <textField>
    <reportElement uuid="3d9beff7-69b8-44d9-af80-2962b9262368" x="29" y="12" width="80" height="20"/>
    <textElement textAlignment="Left"/>
    <textFieldExpression><![CDATA["Page: "+$V{PAGE_NUMBER}]]></textFieldExpression>
    </textField>
    </band>
    </pageFooter>
    </jasperReport>
    自定义报告填充器实现:(这处理高度重置逻辑,以确保明细带从第2页开始更长)
    public class CustomVerticalFiller extends JRVerticalFiller {

    private JRFillBand detailBand = null;

    private int pageNumber = -1;

    protected CustomVerticalFiller(JasperReportsContext jasperReportsContext, JasperReport jasperReport) throws JRException {
    super(jasperReportsContext, jasperReport);

    detailBand = detailSection.getFillBands()[0];
    }

    // this method gets called after each detail band row is filled
    protected void resolveBandBoundElements(JRFillBand band, byte evaluation) throws JRException {
    if(band == detailBand) {
    if((detailBand.getBreakHeight() > columnFooterOffsetY - offsetY) && (columnIndex == columnCount - 1)) {
    // we have reached end of a page

    pageNumber++;

    // we reset the offset when we are at the end of page 2, so that jasper continues to fill data
    if(pageNumber == 1) {
    columnFooterOffsetY += pageFooter.getHeight();
    }
    }
    }
    }
    }
    以及实际上使用自定义填充符导出PDF的Java代码:
    InputStream inputStream = new FileInputStream(new File(<my jrxml file path>));

    JRDataSource dataSource = new JRXmlDataSource(new File(<my source xml file path>), "//employee");

    Map parameters = new HashMap();

    JasperDesign jasperDesign = JRXmlLoader.load(inputStream);
    JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);

    CustomVerticalFiller customVerticalFiller = new CustomVerticalFiller(DefaultJasperReportsContext.getInstance(), jasperReport);
    JasperPrint jasperPrint = customVerticalFiller.fill(parameters, dataSource);

    JasperExportManager.exportReportToPdfFile(jasperPrint, <target pdf file path>);

    关于jasper-reports - 仅在首页上打印页脚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13485488/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com