【问题标题】:Jasper : Compiling same jrxml file into multiple output formatsJasper:将相同的 jrxml 文件编译成多种输出格式
【发布时间】:2015-08-30 18:53:06
【问题描述】:

我正在做一个具有以下要求的 POC:

我在数据库中有两个表 A 和 B,它们具有相同的列和列类型。

我正在运行以下查询来获取两个表之间的差异,即。相同的键、不同的列或行存在于一个中但不存在于另一个中:

 SELECT MIN(TableName) as TableName, ID, COL1, COL2, COL3 ...
 FROM
 (
 SELECT 'Table A' as TableName, A.ID, A.COL1, A.COL2, A.COL3, ...
 FROM A
 UNION ALL
 SELECT 'Table B' as TableName, B.ID, B.COL1, B.COl2, B.COL3, ...
 FROM B
) as tmp
GROUP BY ID, COL1, COL2, COL3 ...
HAVING COUNT(*) = 1
ORDER BY ID

一旦我在 Java 集合中获得不同的行,我想将它们作为报告输出。

但是,要求是输出格式应该是可配置的。例如如果要求生成 PDF,则输出应为 PDF。如果要求是 XLS,则输出应该是 XLS。

现在,我正在探索生成单个 JRXML 文件并将相同的 JRXML 编译成 PDF 或 XLS 的可能性。

有可能吗?谁能指点我一个例子,其中相同的 JRXML 被编译成多种输出格式。

感谢阅读!

【问题讨论】:

  • 你有什么尝试吗?运气好吗?
  • 所以? 3 人或多或少的回答是一样的……是的,有可能。现在有什么问题吗?
  • @Anto:是的..我尝试了答案的方式并且它起作用了。谢谢..
  • @DownVoter:请解释一下投反对票……如果它没有早点评论……那是因为周末出去了,只能在今天尝试……

标签: java jasper-reports


【解决方案1】:

是的,这是可能的。您必须编写 jrxml 并编译成 jasper 文件。然后,当您拥有 JasperPrint 时,您可以要求构建 PDF 文件 (JRPdfExporter):

public ByteArrayOutputStream fillPDF(JasperPrint jasperPrint) throws Exception{
     ByteArrayOutputStream baos = new ByteArrayOutputStream();
     JRPdfExporter exporter = new JRPdfExporter();
     exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
     exporter.setParameter(JRPdfExporterParameter.OUTPUT_STREAM,baos); 
     exporter.exportReport(); 
     return baos;
}

或 XLS 文件 (JRXlsExporter):

public ByteArrayOutputStream fillXLS(JasperPrint jasperPrint) throws Exception{
     ByteArrayOutputStream baos = new ByteArrayOutputStream();
     JRXlsExporter exporterXls = new JRXlsExporter();
     exporterXls.setParameter( JRExporterParameter.JASPER_PRINT, jasperPrint );
     exporterXls.setParameter( JRExporterParameter.OUTPUT_STREAM, baos);
     exporterXls.exportReport(); 
     exporterXlsbaos;
}

注意:为了简单起见,我已经重复了代码,但是您可以编写一个方法和一个带有报告类型的参数。此外,您可以正确处理异常。

【讨论】:

  • mhhhhhhh... 好像是笔误,因为不可能是方法... 这是2年前的事了,我不太记得这行了:?!无论如何,我记得代码运行良好:)
【解决方案2】:

当然有可能。我需要实现一种方法来生成两种格式的报告。而且我实际上已经用两种不同的方法拆分了输出部分的格式(只是为了我的易用性:))。所以基本上你可以创建两个方法(如果只是 pdf 和 xls 格式)并根据你的要求调用它们(你也可以将所有内容放在一个方法中,但在这种情况下你必须使用一些控件。在我的情况,我的方法中的负责部分是:

        public void generatePDF(JasperPrint print) throws FileNotFoundException, JRException,
                                                                           IOException {
        ///// For printing report as PDF file ////////
        java.util.Date date = new java.util.Date();
        SimpleDateFormat ft = new SimpleDateFormat("dd.MM.yyyy_hh.mm.ss");
        String now = ft.format(date);
        String new_name = now + ".pdf";
        OutputStream out = null;
        out = new FileOutputStream(new File("/" + new_name));
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        JasperExportManager.exportReportToPdfStream(print, out);
        out.write(byteArrayOutputStream.toByteArray());
        out.flush();
        out.close();
}

    public void generateEXCEL(JasperPrint print) throws FileNotFoundException, JRException,
                                                                         IOException {
    //--------------EXCEL---------------
    java.util.Date date = new java.util.Date();
    SimpleDateFormat ft = new SimpleDateFormat("dd.MM.yyyy_hh.mm.ss");
    String now = ft.format(date);
    String excel = now + ".xls";
    OutputStream out2 = null;
    out2 = new FileOutputStream(new File("/" + excel));
    ByteArrayOutputStream byteArrayOutputStream2 = new ByteArrayOutputStream();
    // coding For Excel:
    JRXlsExporter exporterXLS = new JRXlsExporter();
    exporterXLS.setParameter(JRXlsExporterParameter.JASPER_PRINT, print);
    exporterXLS.setParameter(JRXlsExporterParameter.OUTPUT_STREAM, byteArrayOutputStream2);
    exporterXLS.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE);
    exporterXLS.setParameter(JRXlsExporterParameter.IS_DETECT_CELL_TYPE, Boolean.TRUE);
    exporterXLS.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE);
    exporterXLS.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE);
    exporterXLS.exportReport();
    out2.write(byteArrayOutputStream2.toByteArray());
    out2.flush();
    out2.close();}

在这种情况下,我将生成的输出保存在操作系统文件系统的 root 目录中(这就是“/”的原因)。

在调用这两个的方法内部,有一个 jrxml 读取:

    JasperPrint print = null;
                try {
                    print = JasperFillManager.fillReport(template, parameters, conn);
}
    ........
    generatePDF(print);
    generateXLS(print);

注意:对于 .xls 输出,需要进行一些格式化。这可以使用一些特定的参数来完成(就像上面的例子一样)。

【讨论】:

    【解决方案3】:

    你可以使用

    JasperExportManager.exportReportToPdfFile(jasperPrint,filename);
    JasperExportManager.exportReportToHtmlFile(filename);
    JasperExportManager.exportReportToXml(jasperPrint);
    

    这些是您可以使用的不同格式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多