JasperReports:如何在jsp页面中调用报表

Posted

技术标签:

【中文标题】JasperReports:如何在jsp页面中调用报表【英文标题】:JasperReports: How to call the report in jsp page 【发布时间】:2011-04-14 09:11:58 【问题描述】:

我使用iReport 3.7.4 version 制作了一份 jasper 报告,现在我必须在我使用 servlet、jsp 和 struts 框架、apache tomcat 作为服务器的 Java 应用程序中使用或调用该报告。

我想通过一些示例了解如何调用 jasper 报告的步骤。

【问题讨论】:

【参考方案1】:
    在 iReport 中编译报告 将编译后的报告放在类路径中

    加载它

    JasperReport jasperReport = (JasperReport) JRLoader.loadObject(inputStream);
    

    用数据填充它。 dataSource 是您拥有的 DataSource 实例 - 例如 BeanCollectionDataSource

    JasperPrint jasperPrint = 
         JasperFillManager.fillReport(jasperReport, params, dataSource);
    

    导出

    JRPdfExporter exporter = new JRPdfExporter();
    exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outputStream);
    exporter.exportReport();
    

    上面的outputStream 可能是response.getOutputStream()FileOutputStream(),这取决于您是将其发送给客户端还是将其存储为文件。如果要将其发送给客户端,则必须发送 Content-Disposition 标头等,但这取决于您要保存的格式。如果您想在客户端打印,这是一个完全不同的问题——您需要一些客户端代码,例如一个小程序。

【讨论】:

自从JRExporterParameter.OUTPUT_STREAM 已被弃用 6 年后,我发布了一个 answer 来展示如何在当前版本中实现此答案。【参考方案2】:

6 年后@Bozho answer 现在(v5 和 v6)在第 5 点包含 已弃用代码 JRExporterParameter.OUTPUT_STREAM,不过我会尽量改进其他点

    加载报告编译版本.jasper

    JasperReport jasperReport = (JasperReport) JRLoader.loadObject(inputStream);
    

    未编译版本.jrxml(速度较慢,因为需要编译但可行)

    JasperReport jasperReport = JasperCompileManager.compileReport("path/to/myReport.jrxml");
    

    填写报告 nothing(数据源在报告中生成或只是静态文本)

    JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params);
    

    使用数据源

    JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, dataSource);
    

    与数据库连接(可能是最常见的,在报告中执行的sql)

    JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, connection);
    

    导出报告

    JRPdfExporter exporter = new JRPdfExporter()
    exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
    exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(outputStream));
    SimplePdfExporterConfiguration configuration = new SimplePdfExporterConfiguration();
    configuration.setMetadataAuthor("Petter"); //Set your pdf configurations, 
    exporter.setConfiguration(configuration);
    exporter.exportReport();
    

    如果您希望将报告流式传输直接到网页,这是contentTypeContent-disposition 的设置方式以及您检索outputStream 的方式

    response.setContentType("application/x-pdf");
    response.setHeader("Content-disposition", "inline; filename=myReport.pdf");
    OutputStream outputStream = response.getOutputStream();
    

【讨论】:

【参考方案3】:

这段代码应该会给你一些关于如何做的想法

JasperReport jr=JasperCompileManager.compileReport("yourJRXMLFilePath");
JasperPrint jrPrint = JasperFillManager.fillReport(jr,mapWithParameters,aJRDataSource);
JasperExportManager.chooseYourFavoriteMethod(jrPrint,"destinationFile");

否则,请检查api 如果你已经用 iReport 编译过文件,第一行可以省略。在这种情况下,请检查 JasperFillManager 上的正确方法的 api。

【讨论】:

【参考方案4】:

在第一个答案中,第 5 点: 之后

JRPdfExporter exporter= new JRPdfExporter();

添加

exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);

【讨论】:

【参考方案5】:

最佳解决方案(也为了更好的性能)将调用编译报告。

你可以看下面的例子

import java.io.IOException;
import java.util.HashMap;

import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;

public class PdfFromJasperFile 
  public static void main(String[] args) throws JRException, IOException 

    JasperPrint jasperPrint = JasperFillManager.fillReport("report.jasper",  new HashMap<String, Object>(), 
    new JREmptyDataSource());
    JasperExportManager.exportReportToPdfFile(jasperPrint, "sample.pdf");

  

【讨论】:

【参考方案6】:

这是一种不同的做法。

    JasperReport jasperReport;
    JasperPrint jasperPrint;
    Map<String, Object> param = new HashMap<String, Object>();
    try
        String sourceFileName = ".jrxml";
        jasperReport = JasperCompileManager.compileReport(sourceFileName);
        jasperPrint = JasperFillManager.fillReport(jasperReport,param,new JRBeanCollectionDataSource(getDetails()));
        JasperExportManager.exportReportToPdfFile(jasperPrint, ".pdf");
    
    catch(Exception e)
    

【讨论】:

以上是关于JasperReports:如何在jsp页面中调用报表的主要内容,如果未能解决你的问题,请参考以下文章

jsp中父页面如何调用iframe中的src子页面中的js方法

如何调用其他jsp页面的参数

jsp页面函数中如何获取sevlet传过来的List

net.sf.jasperreports.engine.JRException如何解决

jsp 如何调用js

在AngularJs中父子页面如何相互调用方法和接收值