.prpt报告从java运行

时间:2013-12-30 13:42:42

标签: java reporting pentaho

之前我使用过Pentaho报告,在那里我可以使用pentaho报表设计器创建报表,并将.prpt文件部署到BI服务器中。它会工作正常。

现在我正在寻找一个解决方案,我可以将.prpt文件放在Java程序中,并像jasper报告(.jrxml文件)一样运行。因为我需要将Pentaho报告与我的Web应用程序集成。

我可能会问一个非常基本的问题。但我没有找到适当的文件。请指出一些正确的位置,示例代码将有所帮助。

3 个答案:

答案 0 :(得分:2)

由于接受答案中的第一个链接似乎不再起作用,正在寻找示例的人可能会发现这更有用:https://github.com/pentaho/pentaho-reporting/blob/master/engine/samples/source/org/pentaho/reporting/engine/classic/samples

某些示例中的代码有点复杂,所以我发布了自己的报表生成器类,其中只包含生成PDF报表的基本要素:

public class ReportGenerator {

  public byte[] generateReport(byte[] templateBytes, Map<String, Object> params) throws Exception {
    ClassicEngineBoot.getInstance().start();

    MasterReport reportData = loadTemplateDefinition(templateBytes);
    addParametersToReport(params, reportData);
    byte[] reportBytes = generateReport(reportData);

    return reportBytes;
  }

  private MasterReport loadTemplateDefinition(byte[] templateBytes) throws Exception {
    ResourceManager resourceManager = new ResourceManager();
    Resource templateResource = resourceManager.createDirectly(templateBytes, MasterReport.class);
    return (MasterReport) templateResource.getResource();
  }

  private void addParametersToReport(Map<String, Object> params, MasterReport reportData) {
    if (params != null) {
      for (String key : params.keySet()) {
        reportData.getParameterValues().put(key, params.get(key));
      }
    }
  }

  private byte[] generateReport(MasterReport reportData) throws ReportProcessingException {
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    PdfOutputProcessor outputProcessor = new PdfOutputProcessor(reportData.getConfiguration(), outputStream, reportData.getResourceManager());

    AbstractReportProcessor reportProcessor = null;
    try {
      reportProcessor = new PageableReportProcessor(reportData, outputProcessor);
      reportProcessor.processReport();
    } finally {
      if (reportProcessor != null) {
        reportProcessor.close();
      }
    }

    return outputStream.toByteArray();
  }
}

generateReport方法接受templateBytes参数中的.prpt文件的内容,以及在params参数中生成报告所需的参数列表。

它返回的字节数组包含生成的PDF报告的内容。

此外,如果您在应用程序中使用Maven,则必须包含所有必需的依赖项。我使用了我在这里找到的列表:http://wiki.pentaho.com/display/Reporting/How+to+integrate+report+designer+to+your+web+application,并在其中用版本6.1.0.1-196替换了所有与pentaho相关的库版本

答案 1 :(得分:1)

我已经在我的Java应用程序中成功嵌入了Pentaho Reporting Engine。有一个包含必要库和示例的教程。启动时唯一需要考虑的是使用相同版本的Pentaho SDK,Pentaho Reporting Engine和Pentaho Report Designer,以避免出现数据源问题。如果您不想要依赖关系的麻烦,可以下载Pentaho Report Designer并将所有库拖放到您的Web应用程序中(当您尝试使用pentaho图表时,大多数问题都出现了,并且它们以这种方式解决)。

官方Pentaho文档:

http://infocenter.pentaho.com/help/index.jsp?topic=%2Freporting_embedders_guide%2Ftopic_embedding_engine.html

Pentaho报告经典引擎核心(最好先尝试一下):

http://sourceforge.net/projects/jfreereport/files/01.%20Classic%20Engine/

只需导入IDE中的所有库(我使用Eclipse Helios),并使用提供的示例,它将作为魅力!然后您可以根据需要开始修改它。我建议您查看如何处理报告的路径。

答案 2 :(得分:0)

    final FacesContext context = FacesContext.getCurrentInstance();
    ClassicEngineBoot.getInstance().start();
    try {
        // load report definition
        ResourceManager manager = new ResourceManager();
        manager.registerDefaults();


        ExternalContext extContext = context.getExternalContext();


        String reportPath = "file:" + extContext.getRealPath("name/name.prpt");

        Resource res = manager.createDirectly(new URL(reportPath), MasterReport.class);
        MasterReport report = (MasterReport) res.getResource();


        ................
        ................

        httpServletResponse.setContentType("application/rtf");
        httpServletResponse.setHeader("Content-Disposition", "attachment; filename=\"name.rtf\"");

        RTFReportUtil.createRTF(report, httpServletResponse.getOutputStream());

        FacesContext.getCurrentInstance().responseComplete();

    } catch (ReportProcessingException ex) {