我正在按照以下要求进行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被编译成多种输出格式。
感谢阅读!
答案 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);
这些是您可以使用的不同格式。