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

时间:2014-03-26 11:52:14

标签: 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 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 个答案:

答案 0 :(得分: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;
}

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

答案 1 :(得分:0)

当然有可能。我需要实现一种方法来生成两种格式的报告。而且我实际上用两种不同的方法分割输出部分的格式(仅仅是为了我的易用性:))。所以基本上你可以创建两个方法(仅仅是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();}

在这种情况下,我将生成的输出保存在OS文件系统的 root 目录中(这是" /"。)

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

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

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

答案 2 :(得分:0)

您可以使用

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

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