Java Jasper:将同一jrxml文件编译成多种输出格式

Java Jasper:将同一jrxml文件编译成多种输出格式,java,jasper-reports,Java,Jasper Reports,我正在进行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 A

我正在进行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被编译成多种输出格式


谢谢你的阅读

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

或XLS文件(JRXlsExporter):


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

这当然是可能的。我需要实现一个方法来生成两种格式的报告。实际上,我已经将输出部分的格式分为两种不同的方法(只是为了便于使用:)。因此,基本上,您可以创建两个方法(在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();
}

在本例中,我将生成的输出保存在OS文件系统的根目录中(这就是“/”的原因)

在调用这两个函数的方法中,只有一个jrxml读取:

    JasperPrint print = null;
                try {
                    print = JasperFillManager.fillReport(template, parameters, conn);
}
    ........
    generatePDF(print);
    generateXLS(print);
注意:在.xls输出的情况下,需要一些格式。这可以使用一些特定的参数来完成(就像上面的情况一样)。

您可以使用

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

你可以使用不同的格式。

你尝试过什么吗?运气好吗?那么?这三个答案或多或少都是一样的…是的,有可能。现在有什么问题吗?@Anto:是的。我尝试过答案的方式,结果成功了。谢谢。@DownVoter:请解释下一票…如果是因为没有早些发表评论的话…那是因为我周末出去了,所以可以投票直到今天…这似乎是一个输入错误,因为它不可能是一种方法…这是两年多前的事了,我真的不记得这句话:?!无论如何,我记得代码工作得很好:)
    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();}
    JasperPrint print = null;
                try {
                    print = JasperFillManager.fillReport(template, parameters, conn);
}
    ........
    generatePDF(print);
    generateXLS(print);
JasperExportManager.exportReportToPdfFile(jasperPrint,filename);
JasperExportManager.exportReportToHtmlFile(filename);
JasperExportManager.exportReportToXml(jasperPrint);