【问题标题】:How add subreports dinamyc in jasperreport [duplicate]如何在碧玉报告中添加动态子报告[重复]
【发布时间】:2020-07-09 23:26:25
【问题描述】:

可以创建一个带有两个子报表的报表并将所有文件都放在我的数据库中吗?那么,我怎样才能通过在我的主报告中填写子报告?我需要在 Temp 文件中保存子报表,并传递目录?还是有办法在 jasperPrint 中添加子报表,然后他自动找到子报表?

这是我的代码:

try (Connection conexao = dataSource.getConnection()){
        FinanceiroTransacao transacao = financeiroTransacaoService.findGatewayIdTransacaoByBoletoAndCartorio(boletoId, cns);
        JasperReport jasperReport;
        jasperReport = JasperCompileManager.compileReport(JRXmlLoader.load(new ByteArrayInputStream(relatorioBase.getConteudo())));
        Map<String, Object> params = new HashMap<>();
        params.put("pedidoId", pedidoId);
        params.put("boletoId", boletoId);
        params.put("cartorio",cns);
        params.put("totalTransacao", transacao.getValorCredito());
        params.put("idTransferencia", transacao.getGatewayPagamentoTransacaoId());
        params.forEach((s, o) -> log.debug("paramentro {} , valor {}", s, o));

        subReports.forEach(subReport -> {
           //HERE I NEED TO add the sub reports 
        });
        JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, conexao);

        JRPdfExporter pdfExporter = new JRPdfExporter();
        pdfExporter.setExporterInput(new SimpleExporterInput(jasperPrint));
        ByteArrayOutputStream pdfReportStream = new ByteArrayOutputStream();
        pdfExporter.setExporterOutput(new SimpleOutputStreamExporterOutput(pdfReportStream));
        pdfExporter.exportReport();
        String retorno = Base64.getEncoder().encodeToString(pdfReportStream.toByteArray());
        pdfReportStream.close();
        return retorno;
    }catch (Exception e){
        e.printStackTrace();
        throw new RuntimeException("erro: "+ e.getMessage());
    }

【问题讨论】:

标签: java jasper-reports subreport


【解决方案1】:

您要做的第一件事是在您的 jaspert 报告中创建一个参数:“SUBREPORT_DIR”,这将是您子报告的位置,因此您可以在报告的 XML 中执行此操作。

</subreport>
   <connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
   <subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "NameSubrport.jasper"]]></subreportExpression>
</subreport>

这适用于每个子报表,因此您可以将报表的名称设为静态。 所以在你的java中你必须传递位置的url,你可以这样做:

Resource r = ApplicationContextProvider.getApplicationContext().getResource("/resources/reports");
String reportPath = r.getFile().getAbsolutePath();
params.put("SUBREPORT_DIR", reportPath + File.separator);

(记住.getResource,它可以获取运行时项目中报告所在文件夹的正确路径)

这种方式对我有用。希望对您有所帮助!

【讨论】:

  • 我的 HD 中没有任何文件,我的所有报告都在我的数据库 (Postgresql) 中,所以我如何传递没有名称的子报告?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
相关资源
最近更新 更多