Java 导出JasperReports查询结果

Java 导出JasperReports查询结果,java,jasper-reports,export,resultset,Java,Jasper Reports,Export,Resultset,在我的Java项目中,我有很多带有复杂SQL查询的JasperReports报告,其中包含很多参数。这些报告用于生成包含查询返回的数据的pdf文档,并以各种方式进行分组和格式化 现在,我还需要直接导出查询结果(例如,结果集、地图或csv文件或类似文件…)。 是否可以要求JasperReports仅执行查询并返回结果,而不是呈现pdf页面 (注意:这与为报表呈现选择csv输出格式不同,因为此方法尝试将报表设计转换为csv文件…相反,我只想在报表中“重用”查询,同时利用JR参数管理等功能。) 这是我

在我的Java项目中,我有很多带有复杂SQL查询的JasperReports报告,其中包含很多参数。这些报告用于生成包含查询返回的数据的pdf文档,并以各种方式进行分组和格式化

现在,我还需要直接导出查询结果(例如,结果集、地图或csv文件或类似文件…)。 是否可以要求JasperReports仅执行查询并返回结果,而不是呈现pdf页面

(注意:这与为报表呈现选择csv输出格式不同,因为此方法尝试将报表设计转换为csv文件…相反,我只想在报表中“重用”查询,同时利用JR参数管理等功能。)

这是我从报告生成pdf文档的Java代码:

JasperReport report = (JasperReport) JRLoader.loadObject(inStream);
JasperPrint jasperprint = JasperFillManager.fillReport(report, params, conn);
JRAbstractExporter exporter = new JRPdfExporter();
exporter.exportReport();
ByteArrayOutputStream os = (ByteArrayOutputStream) exporter.getParameter(JRExporterParameter.OUTPUT_STREAM);
byte[] formattedReportBytes = os.toByteArray();
return formattedReportBytes;
我看到JasperReports中有一个名为JRJdbcQueryExecuter的类。。。 是否可以直接调用它而不是调用
fillReport
,以获取已执行SQL查询的结果集


谢谢

我想从这一点开始,这感觉是错误的和有问题的,但这是可能的,除了让JasperReports执行查询之外

JasperReport report = (JasperReport) JRLoader.loadObject(inStream);

//this is the actual query in the report
JRQuery query = report.getMainDataSet().getQuery;

//once here you get the entire sql string, this will have any parameters replaced with 
//the '?' character
String queryString = query.getText();

//now start building your prepared statement, I am assuming you already have your
//connection in the conn variable
PrepararedStatment statement = con.prepareStatement(queryString);

//almost there, need to set the parameters
//the sql query is broke up into chunks inside the JRQuery. The chunks have types 
//that are  either text, parameter, or parameter clause. We care about parameter, 
//not sure what parameter clause would be to be honest
int index = 0; //this is the index to set the parameter at in the statement
for (JRQueryChunk chunk : query.getChunks()){
     if (chunk.getType() == JRQueryChunk .TYPE_PARAMETER){
         statement.setObject(index, params.get(chunk.getText()));
         index = index + 1;
     }
}
//then execute the query
ResultSet results = statement.executeQuery();

注意:这里没有错误检查,您应该添加它。也不确定这样做是否是个好主意。最好是将查询从报告中移出,并全部放入java代码中。然后将结果集作为数据源传入即可。

为什么要使用JasperReports API来解决此任务?正如我前面所说,我有很多报告,其中包含长sql查询(带有许多参数),并生成复杂的pdf渲染、将数据分组等。。现在,我还必须提取数据库查询结果,而不进行任何处理、分组或呈现。这就像我从报表中手动复制查询,用实际值替换所有$P{},将其粘贴到SQL客户机中,执行并提取为csv文件。我正在寻找一种通过代码自动完成这项工作的方法,利用JR参数管理,并获得已解析并准备好执行的查询……这项工作的目的是什么?您将如何处理返回的结果集?很有趣…我知道我可以将我的报告查询复制到Java代码中,使用字符串替换函数手动用实际值替换所有参数,等等。。。但是这样,对于每个报表,我必须维护两个不同的查询,一个是在Java中硬编码的,另一个包含在报表中!其目的是将查询结果提取为csv或xls文件,这是某种形式的数据处理所需要的。不起作用。queryString仍然包含JR格式的参数(例如$P{PARAM_1}),未进行解析。我正在寻找一种将最终查询提取为字符串的方法,以便手动执行它,或者一种截取JR执行它的时刻并返回结果的方法,而不是继续进行文档呈现……您确定吗,当我运行它时,参数被替换为“?”字符。在JRQueryChunk中循环怎么样?你可以重建查询并用问号替换参数。好的,我对它做了一些修改,现在它工作起来很有魅力。谢谢!:)真的很有帮助:)谢谢:)