猿问

JasperReport串联仅打印第一个报告

我正在尝试使用 JasperReports 连接两个报告,我有一个包含来自报告“A”和报告“B”的两个 jasperPrint 的列表。问题是它只打印第一个报告,第二页是空的。我虽然问题出在报告“B”中,但如果我先打印报告“B”,我也会遇到同样的问题:打印报告“B”,而应该是报告“A”的第二页是空的。


这是我的代码:


public static InputStream generatePdfByteArrayFromJasper(List<InputStream> reportStreams, Collection dataSource, HashMap<String, Object> parameters)

throws JRException {

    List<JasperPrint> jasperPrints = new ArrayList<>();

    JRDataSource datasource = new JRBeanCollectionDataSource(dataSource, true);

    for (InputStream is : reportStreams) {

        JasperPrint jasperPrint = JasperFillManager.fillReport(is, parameters, datasource);

        jasperPrints.add(jasperPrint);

    }

    JRPdfExporter exporter = new JRPdfExporter();

    ByteArrayOutputStream out = new ByteArrayOutputStream();

    SimpleOutputStreamExporterOutput exporterOutput = new SimpleOutputStreamExporterOutput(out);

    SimplePdfExporterConfiguration configuration = new SimplePdfExporterConfiguration();

    configuration.setCreatingBatchModeBookmarks(true);

    exporter.setConfiguration(configuration);

    exporter.setExporterInput(SimpleExporterInput.getInstance(jasperPrints));

    exporter.setExporterOutput(exporterOutput);

    exporter.exportReport();

    return new ByteArrayInputStream(out.toByteArray());

}

有人可以帮助我吗?谢谢!


潇潇雨雨
浏览 104回答 1
1回答

Cats萌萌

不要对两个报表使用相同的数据源对象。数据源被第一个报告消耗,并且不会为第二个报告留下任何记录。您应该做的是为每个报告创建数据源实例。对参数映射执行相同的操作是一个好主意,因为填充过程会将内置参数填充到映射中,并且存在第一个报告设置的参数最终用于第二个报告的风险。所以代码看起来像这样:public static InputStream generatePdfByteArrayFromJasper(List<InputStream> reportStreams, Collection dataSource, HashMap<String, Object> parameters)throws JRException {&nbsp; &nbsp; List<JasperPrint> jasperPrints = new ArrayList<>();&nbsp; &nbsp; for (InputStream is : reportStreams) {&nbsp; &nbsp; &nbsp; &nbsp; JRDataSource datasource = new JRBeanCollectionDataSource(dataSource, true);&nbsp; &nbsp; &nbsp; &nbsp; HashMap<String, Object> reportParameters = new HashMap<>(parameters);&nbsp; &nbsp; &nbsp; &nbsp; JasperPrint jasperPrint = JasperFillManager.fillReport(is, reportParameters, datasource);&nbsp; &nbsp; &nbsp; &nbsp; jasperPrints.add(jasperPrint);&nbsp; &nbsp; }
随时随地看视频慕课网APP

相关分类

Java
我要回答