在收到聊天中的两个问题并评论了“合并的”碧玉报告中如何处理页码的答案后,我决定通过此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字符串。有什么方法可以做到这一点吗? 谢谢
我需要在数据源的每个记录后强制分页。我尝试了,但不起作用。怎么做?