【问题标题】:.prpt reports running from java.prpt 报告从 java 运行
【发布时间】:2013-12-30 13:42:42
【问题描述】:

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

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

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

【问题讨论】:

    标签: java reporting pentaho


    【解决方案1】:

    由于已接受答案中的第一个链接似乎不再起作用,正在寻找示例的人可能会发现这更有用: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 params) 抛出异常 {
        ClassicEngineBoot.getInstance().start();
    
        MasterReport reportData = loadTemplateDefinition(templateBytes);
        addParametersToReport(params, reportData);
        byte[] reportBytes = generateReport(reportData);
    
        返回报告字节;
      }
    
      私人 MasterReport loadTemplateDefinition(byte[] templateBytes) 抛出异常 {
        资源管理器资源管理器 = 新资源管理器();
        资源模板Resource = resourceManager.createDirectly(templateBytes, MasterReport.class);
        return (MasterReport) templateResource.getResource();
      }
    
      私有 void addParametersToReport(Map params, MasterReport reportData) {
        如果(参数!= null){
          对于(字符串键:params.keySet()){
            reportData.getParameterValues().put(key, params.get(key));
          }
        }
      }
    
      私有字节[] generateReport(MasterReport reportData) 抛出 ReportProcessingException {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        PdfOutputProcessor outputProcessor = new PdfOutputProcessor(reportData.getConfiguration(), outputStream, reportData.getResourceManager());
    
        AbstractReportProcessor reportProcessor = null;
        尝试 {
          reportProcessor = new PageableReportProcessor(reportData, outputProcessor);
          reportProcessor.processReport();
        } 最后 {
          如果(报告处理器!= null){
            报告处理器.close();
          }
        }
    
        返回 outputStream.toByteArray();
      }
    }
    

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

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

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

    【讨论】:

      【解决方案2】:

      我已经成功地将 Pentaho Reporting Engine 嵌入到我的 Java 应用程序中。有一个包含必要库和示例的教程。开始时唯一需要考虑的是使用相同版本的 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 Reporting Classic Engine Core(最好先试试这个):

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

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

      【讨论】:

      • 嗨 Cho Cho,我能够成功地将 pentaho 报告与我的应用程序集成。带有表格数据的报告生成良好,但无法获取带有饼图或条形图的报告。我是否需要添加更多其他更改>
      • Praneeth,将这些 jars 添加到您的项目中:“legacy-charts”、“jfreechart”和“jcommon”。请务必匹配相同版本的 PRD 和 Reporting Engine。您可以在 Report Designer 路径的 lib 文件夹中找到这些 jar。不要忘记,匹配相同的版本(例如,PRD 5.1.0 和 Reporting Engine 5.1.0)link
      【解决方案3】:
          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) {
      

      【讨论】:

      • 请说明您的代码的作用以及它如何回答问题。如果您得到一个代码 sn-p 作为答案,您可能不知道如何处理它。答案应为 OP 提供有关如何调试和解决问题的指导。指出您的代码背后的想法是什么,极大地有助于理解问题并应用或修改您的解决方案。此外,您的回答似乎只回答了部分问题。
      • 有一个项目 - github.com/tmorgner/pentaho-reporting-oem-sdk 与 pentaho-reporting 作者 cmets 共享了很多报告示例
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多