2014-03-26 25 views
1

我做了POC与下面要求:碧玉:编译相同JRXML文件分成多个输出格式

我有具有相同的列和列类型的两个表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被编译成多种输出格式。

感谢您的阅读!

+0

你有什么尝试吗?运气好的话? – Anto

+0

那么?或多或少的3回答相同...是的,这是可能的。现在有什么问题吗? – ganzux

+0

@Anto:是的..我尝试了答案,它的工作方式。谢谢.. – Nik

回答

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; 
} 

注:简单地,我已经重复了代码,但可以编写一个方法和一个包含报告类型的参数。另外,您可以正确处理例外情况。

+0

whats ithe code exporterXlsbaos的意思是? –

+0

mhhhhhhh ...它似乎是一个错字,因为它不能成为一种方法......这是两年多前,我不记得这一行:?! 无论如何,我记得代码工作完美:) – ganzux

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文件的(这就是为什么“/”)。

尽管该方法调用这两个内,存在读取单个JRXML:

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

注意:在.xls的输出的情况下,需要一些格式。这可以使用一些特定的参数来完成(就像在上面的例子中一样)。

0

您可以使用

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

这些都是不同的格式,你可以使用。