我有一个Spring项目。我还使用JasperReport为我的Spring项目构建报告模板,以便调用、使用和生成。
在看了几个教程之后,我终于设法让我的Spring项目调用并生成了我的报告模板。
但有一件事我不熟悉,那就是我用一个数据集查询配置了我的Jasper Reports,当我在JasperSoft中预览模板时,该查询会用数据填充模板。但当我通过Spring调用这个相同的report.jasper
文件时,我得到的只是一个空报告(尽管有一些预期的格式(
我遇到的大多数例子都让他们的JasperReport在通过Spring从数据库传递所需数据时使用空数据源。但我的报告使用了多个数据集查询(因此使用了多个子表(,所以我不确定我该何去何从;我是否需要像那些例子一样通过Spring手动传递数据,或者我可以依靠JasperReport来做到这一点
我对Jasper和Spring还是比较陌生的。
基于这个链接创建的,这是我的测试函数示例:
@GetMapping(path = "/report")
void testFunction2(HttpServletResponse response) throws IOException, JRException {
String sourceFileName = new File("C:\\Users\\User\\JaspersoftWorkspace\\MyReports\\base3.jasper").getAbsolutePath();
JRBeanCollectionDataSource sampleDataSource = new JRBeanCollectionDataSource(null);
String testName = "testName.xlsx";
HashMap<String, Object> theHashMap = new HashMap<>();
JasperPrint jasperPrint = JasperFillManager.fillReport(sourceFileName, theHashMap);
JRXlsxExporter exporter = new JRXlsxExporter();
SimpleXlsxReportConfiguration reportConfigXLS = new SimpleXlsxReportConfiguration();
reportConfigXLS.setSheetNames(new String[] { "sheet1" });
exporter.setConfiguration(reportConfigXLS);
exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(response.getOutputStream()));
response.setHeader("Content-Disposition", "attachment;filename="+testName);
response.setContentType("application/octet-stream");
exporter.exportReport();
}
我想我解决了我的问题/困惑。
我需要的最重要的东西是连接到我的数据库。大多数教程的数据源都是从Spring项目本身连接的,进行存储库调用,并将调用中的数据发送到要生成的报告。
在我的例子中,我不是从Spring端调用DB,而是从Jasper端调用DB。
因此,或者,我的问题的解决方案是,我可以使用DriverManager.getConnection()
发送连接详细信息,并将其作为第三个变量解析为fillReport
,而不是数据源。
基本上,其他人都在做什么
JRBeanCollectionDataSource sampleDataSource = new JRBeanCollectionDataSource(repositoryService.getData());
JasperPrint report = JasperFillManager.fillReport(compiledReport, parameters, sampleDataSource);
但我想要的是这个
Connection con = DriverManager.getConnection("jdbc:postgresql://url:port/dbName","dbUsername","dbPassword");
JasperPrint jasperPrint = JasperFillManager.fillReport(compiledReport, parameters, con);
(但两种方法都是正确的(
一旦我完成了第二个方法,我的报告数据就会使用JasperSoft中所有预先配置的SQL查询成功生成。
我从这里得到了这个想法