导出JasperReports查询结果

时间:2012-03-20 15:10:47

标签: java jasper-reports export resultset

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

现在我还需要直接导出查询结果(例如ResultSet,Map或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查询的ResultSet?

由于

1 个答案:

答案 0 :(得分:7)

我想从这开始,这感觉错误和hacky,但它是可能的,减去实际上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代码中可能会更好。然后只需将ResultSet作为数据源传递,你就可以了。