簡體   English   中英

導出JasperReports查詢結果

[英]Export JasperReports query results

在我的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作為數據源傳遞,你就可以了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM