多Jasper Reports页码关联:通过标识在Java中修改起始页码
实现Jasper Report多报表连续页码的实用方案
嘿,我之前也碰到过类似的需求,要让两份报表的页码无缝衔接,第二份从第一份的总页数+1开始。下面给你分享两种靠谱的实现方式,其中第二种更贴近你想要的“定位组件修改”的思路:
方式一:用参数传递(最简洁易维护)
这种方式不用硬找组件,通过报表参数来控制起始页码,灵活又省心:
- 在第二份报表里定义参数:打开第二份报表的jrxml文件,添加一个名为
START_OFFSET的参数(类型选Integer)。 - 修改页码TextField的表达式:找到你用来显示页码的TextField,把它的表达式从原来的
$V{PAGE_NUMBER}改成$V{PAGE_NUMBER} + $P{START_OFFSET}。 - Java代码里传递参数:
- 先渲染第一份报表,获取它的总页数:
// 填充第一份报表 JasperPrint jasperPrint1 = JasperFillManager.fillReport("first_report.jasper", params1, dataSource1); // 获取第一份报表的总页数 int totalPagesFirst = jasperPrint1.getPages().size(); - 给第二份报表的参数赋值,然后填充:
Map<String, Object> params2 = new HashMap<>(); // 设置起始偏移量为第一份的总页数 params2.put("START_OFFSET", totalPagesFirst); JasperPrint jasperPrint2 = JasperFillManager.fillReport("second_report.jasper", params2, dataSource2);
- 先渲染第一份报表,获取它的总页数:
方式二:直接定位TextField修改表达式
如果你一定要像操作HTML ID那样找到对应的TextField修改,那可以通过遍历报表设计元素来实现:
- 给目标TextField设置name属性:在第二份报表的jrxml里,给页码对应的
<reportElement>加上name="pageNumberField",比如:<textField> <reportElement x="700" y="20" width="80" height="20" name="pageNumberField"/> <textElement textAlignment="Right"/> <textFieldExpression><![CDATA[$V{PAGE_NUMBER}]]></textFieldExpression> </textField> - Java代码里加载报表设计并修改:
// 先获取第一份报表的总页数 JasperPrint jasperPrint1 = JasperFillManager.fillReport("first_report.jasper", params1, dataSource1); int totalPagesFirst = jasperPrint1.getPages().size(); // 加载第二份报表的设计文件 JasperDesign jasperDesign2 = JRXmlLoader.load("second_report.jrxml"); // 遍历所有Band里的元素,找到目标TextField for (JRBand band : jasperDesign2.getAllBands()) { for (JRReportElement element : band.getElements()) { if (element instanceof JRTemplateTextField && "pageNumberField".equals(element.getName())) { JRTemplateTextField pageField = (JRTemplateTextField) element; // 修改表达式,让页码从第一份总页数+1开始 pageField.getExpression().setText("$V{PAGE_NUMBER} + " + totalPagesFirst); break; } } } // 编译修改后的设计文件并填充 JasperReport jasperReport2 = JasperCompileManager.compileReport(jasperDesign2); JasperPrint jasperPrint2 = JasperFillManager.fillReport(jasperReport2, params2, dataSource2);
小提示
如果你的报表已经是编译好的.jasper文件,不想重新编译的话,还是推荐用参数传递的方式,因为直接修改已编译报表的元素会比较麻烦,容易出问题。
内容的提问来源于stack exchange,提问作者Novy
相关产品推荐
相关产品推荐

