Java Jasper:将同一jrxml文件编译成多种输出格式
我正在进行POC,要求如下: 我在数据库中有两个表A和B,它们具有相同的列和列类型 我正在运行以下查询以获取这两个表之间的差异,即。同一个键、不同的列或行存在于一个键中,但不存在于另一个键中: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
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);