How to recalculate page number when combining multiple jasper reports in export?

后端 未结 4 2127
借酒劲吻你
借酒劲吻你 2020-12-06 15:06

I have decided to pass this Q/A after receiving both questions in chat and comment on answer on how to handle page number in \"combined\" jasper reports

Whe

4条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-12-06 15:33

    The jasper-report way would be to not combine reports in java but to use a main report and include the different reports as subreports in this main report, moving the page number to the main report.

    However, if we like to combine in java as in questions, we can also use java to edit and correct the page numbers.

    This idea is to set "markers" in report and then post-process the JasperPrint, replacing the markers with the actual page number.

    Example

    jrxml (without shame using freemaker style)

    
        
        
        
    
    
        
        
    
    

    java

    Define my markers

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

    after the fillReport of my reports replace all my markers with the true numbers

    //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 pages = jp.getPages();
        //Loop all pages of report
        for (JRPrintPage jpp : pages) {
            List 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++;
        }
    }
    

    Note: If it was code in one of my projects I would not nest this quantity of for and if statements, but extract code to different method's, but for clarity of post I have decided to post it all as one code block

    Now its ready for the export

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

提交回复
热议问题