java - 导出 JasperReports 查询结果

标签 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?

谢谢

最佳答案

我想首先说这感觉是错误的和 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 作为数据源传入,就可以开始了。

关于java - 导出 JasperReports 查询结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9789443/

相关文章:

jasper-reports - 在 iReport 中格式化日期参数

java - 我怎样才能获得工作 Selenium

java - Servlet 只读取 Excel 文件的前两行

java - 我应该将 "mysql-connector-java-5.1.31-bin.jar"文件放在 Netbeans 中的哪个位置?

java - 条件样式无法更改背景色

java - 更改预编译 Jasperreport 中 JRChart 的渲染器

php - bash 和 php-cli 之间的变量

windows - Packr 不工作

database - 从数据库表增量导出记录

java - 弹跳矩形(图形g)