当前位置: 首页 > 面试题库 >

在导出中合并多个jasper报告时,如何重新计算页码?

万俟沛
2023-03-14
问题内容

在收到聊天中的两个问题并评论了“合并的”碧玉报告中如何处理页码的答案后,我决定通过此Q
/ A

在使用Java合并报表时

JasperPrint jasperPrint1 = JasperFillManager.fillReport(report1, paramMap);
JasperPrint jasperPrint2 = JasperFillManager.fillReport(report2, paramMap);
List<JasperPrint> jasperPrintList = Arrays.asList(jasperPrint1, jasperPrint2);

JRPdfExporter exporter = new JRPdfExporter();
exporter.setExporterInput(SimpleExporterInput.getInstance(jasperPrintList));

页码和总页码

<textField>
    <reportElement x="435" y="30" width="80" height="20" uuid="14bad2ac-3a56-4cf4-b4dd-310b8fcd2120"/>
    <textElement textAlignment="Right"/>
    <textFieldExpression><![CDATA["Page "+$V{PAGE_NUMBER}+" of"]]></textFieldExpresshtml" target="_blank">ion>
</textField>
<textField evaluationTime="Report">
        <reportElement x="515" y="30" width="40" height="20" uuid="06567ba6-6243-43e9-9813-f6593528524c"/>
        <textFieldExpression><![CDATA[" " + $V{PAGE_NUMBER}]]></textFieldExpression>
</textField>

对于清单中包含的每个报告,始终会重新启动,是否可以重新计算这些报告?

考虑到我的最终合并报表,我希望每页上都有当前页面(以及正确的总页数)。


问题答案:

jasper-report方法将不是在Java中合并报告,而是使用主报告,并将不同的报告作为子报告包含在此主报告中,从而将页码移至主报告中。

但是,如果我们希望像问题中那样结合使用Java,则也可以使用Java编辑和更正页码。

这个想法是在报表中设置“标记”,然后对进行后处理,然后JasperPrint用实际的页码替换标记。

jrxml (使用Freemaker样式时不要感到羞耻)

<textField>
    <reportElement x="435" y="30" width="80" height="20" uuid="14bad2ac-3a56-4cf4-b4dd-310b8fcd2120"/>
    <textElement textAlignment="Right"/>
    <textFieldExpression><![CDATA["${CURRENT_PAGE_NUMBER}"]]></textFieldExpression>
</textField>
<textField evaluationTime="Report">
    <reportElement x="515" y="30" width="40" height="20" uuid="06567ba6-6243-43e9-9813-f6593528524c"/>
    <textFieldExpression><![CDATA["${TOTAL_PAGE_NUMBER}"]]></textFieldExpression>
</textField>

Java

定义我的标记

private static final String CURRENT_PAGE_NUMBER = "${CURRENT_PAGE_NUMBER}";
private static final String TOTAL_PAGE_NUMBER = "${TOTAL_PAGE_NUMBER}";

fillReport我的报告之后,用真实数字替换所有标记

//First loop on all reports to get totale page number
int totPageNumber=0;
for (JasperPrint jp : jasperPrintList) {
    totPageNumber += jp.getPages().size();
}

//Second loop all reports to replace our markers with current and total number
int currentPage = 1;
for (JasperPrint jp : jasperPrintList) {
    List<JRPrintPage> pages = jp.getPages();
    //Loop all pages of report
    for (JRPrintPage jpp : pages) {
        List<JRPrintElement> elements = jpp.getElements();
        //Loop all elements on page
        for (JRPrintElement jpe : elements) {
            //Check if text element
            if (jpe instanceof JRPrintText){
                JRPrintText jpt = (JRPrintText) jpe;
                //Check if current page marker
                if (CURRENT_PAGE_NUMBER.equals(jpt.getValue())){
                    jpt.setText("Page " + currentPage + " of"); //Replace marker
                    continue;
                }
                //Check if totale page marker
                if (TOTAL_PAGE_NUMBER.equals(jpt.getValue())){
                    jpt.setText(" " + totPageNumber); //Replace marker
                }
            }
        }
        currentPage++;
    }
}

注意:
如果这是我项目中的代码,则我不会嵌套大量的for和if语句,而是将代码提取到不同的方法中,但是为了清楚起见,我决定将所有内容都作为一个代码块发布

现在准备出口

JRPdfExporter exporter = new JRPdfExporter();
exporter.setExporterInput(SimpleExporterInput.getInstance(jasperPrintList));
....


 类似资料:
  • 问题内容: 我有一个带有下拉菜单的Web应用程序,用户可以从中选择报表的类型。report1,report2,report3等。 基于所选的报告,Jasper报告将在服务器上编译并以PDF格式作为弹出窗口打开。 在服务器端,我使用下面的代码(例如对于report1)使用一种单独的方法来实现每个报告: 同样,report2在具有以下代码的单独方法中: 现在,我有一个要求,如果从下拉列表中选择了rep

  • 我是Jasper报告的新手。我有一个包含2组的报告。根据查询,正在打印多页。 第一组高度 - 95分,第二组高度 - 144分 我希望这些多页打印在一页中(我希望一页中包含5页)。每页高度为239点。(即使页面内容小于239分,我希望将剩余部分保留为空白,并在239分后开始下一页)。我尝试创建一个报告,并将上述报告作为子报告,并设置主报告的高度为1195(239*5)点。尽管如此,这些都被打印在不

  • 我试图在jrxml中创建表格。表格中的列数可能会很大,当我试图以PDF格式导出报告时,由于列数很大,数据变得不可读。有什么方法可以让我们以更大的页面尺寸(如A3)导出报告,或者在A4尺寸上增加滚动功能。注意:报告只需要导出为pdf格式,而不是CSV或任何其他格式。 谢谢,任何帮助感谢。

  • 如何在jasper子报告中显示当前页码?我只做了第一页,变量如下:$V{page_NUMBER}和“(”$V{page_COUNT}“)”,但我们如何在所有子报告中显示?

  • 我有一个代码如下所示: 将pdf文件输出到物理文件夹的工作正常。我想要的是将pdf导出为base 64字符串。有什么方法可以做到这一点吗? 谢谢

  • 我需要在数据源的每个记录后强制分页。我尝试了,但不起作用。怎么做?