如何在 web 中嵌入 pentaho 报表设计器?

Posted

技术标签:

【中文标题】如何在 web 中嵌入 pentaho 报表设计器?【英文标题】:How to embed pentaho report designer in web? 【发布时间】:2012-12-05 11:21:46 【问题描述】:

我正在尝试弄清楚如何在网页上嵌入 Pentaho Report Designer 报告。

我的意思不仅仅是打印 PRD 报告的结果——我实际上仍然希望使用 PRD 来设计报告,但要在 Web 框架内。

有可能吗?

谢谢

【问题讨论】:

【参考方案1】:

您可以使用 Pentaho BI Server 来部署您的报表。这意味着另一个应用程序可以通过 Web 生成报告,甚至 BI Server 用户也可以生成报告。您可以配置单点登录和其他奇特的东西以将 BI 服务器用作报表服务器。

编辑报表的唯一方法是通过 Pentaho 报表设计器,它是在您的桌面上运行的 Java 应用程序。通过 BI Server 界面,您只能管理已部署的报表。

【讨论】:

【参考方案2】:

如果您不想让服务器 pentaho 运行来执行此操作,您可以制作一个 servlet,其输出是 html、pdf 等格式的报告内容,这可以使用库 pentaho 报告设计器来完成可以在同一个工具中找到,首先您设计报告,然后在您创建的 servlet 中运行它,将位置、输出类型和您在报告中定义的其他参数作为参数传递

导入会话.ReportSession;

公共类 ServletReport 扩展 HttpServlet

public ServletReport() 



public void init() 
      ClassicEngineBoot.getInstance().start();


受保护的 void doGet(HttpServletRequest req, HttpServletResponse 分别) 抛出 ServletException, IO异常 生成报告(请求,响应);

protected void doGet(HttpServletRequest req,    
                       HttpServletResponse resp) throws ServletException,
                                                        IOException 
    generateReport(req, resp);

protected void doPost(HttpServletRequest req,    
                       HttpServletResponse resp) throws ServletException,
                                                          IOException 
    generateReport(req, resp);



private void generateReport(HttpServletRequest req,
                            HttpServletResponse resp) throws ServletException,
                                                             IOException 
    HttpSession session = req.getSession(true);
    ReportSession values =
        (ReportSession)session.getAttribute("ReportSession");
    //  URL reportDefinitionURL = values.getReportDefinitionURL();

    String reportPath = req.getParameter("Report");
    String contenType = (String)req.getParameter("ContenType");
    //String isMDX = (String)req.getParameter("MDX");
    String url =
        req.getRequestURL().substring(0, req.getRequestURL().indexOf("servletreport")) +
        "Reportes/";
    URL reportDefinitionURL = new URL(url + reportPath);
    MasterReport report = createReportDefinition(reportDefinitionURL);
            try 
             //report.setQ
            Map<String, Object> reportParameters =
                values.getReportParameters();
            if (null != reportParameters) 
                for (String key : reportParameters.keySet()) 
                    report.getParameterValues().put(key,
                                                    (Object)reportParameters.get(key));
                
            

         catch (Exception e) 
            // TODO: Add catch code
            e.printStackTrace();
        

        OutputStream out = resp.getOutputStream();
        try 
            if (contenType.equalsIgnoreCase("HTML")) 
                resp.setContentType("text/html; charset=\"UTF-8\"");
                HtmlReportUtil.createStreamHTML(report, out);
             else if (contenType.equalsIgnoreCase("PDF")) 
                resp.setContentType("application/pdf");
                PdfReportUtil.createPDF(report, out);
             else if (contenType.equalsIgnoreCase("EXCEL")) 
                resp.setContentType("application/vnd.ms-excel");
                ExcelReportUtil.createXLS(report, out);
             else if (contenType.equalsIgnoreCase("RTF")) 
                resp.setContentType("application/rtf");
                RTFReportUtil.createRTF(report, out);
            
         catch (ReportProcessingException rpe) 
            rpe.printStackTrace();
         finally 
            out.close();
        



//Return a value using EL
private Object executeValueExpression(String valueExpression) 
    FacesContext fctx = FacesContext.getCurrentInstance();
    ELContext elctx = fctx.getELContext();
    Application app = fctx.getApplication();
    ExpressionFactory exprFactory = app.getExpressionFactory();
    ValueExpression valueExpr =
        exprFactory.createValueExpression(elctx, valueExpression,
                                          Object.class);
    return valueExpr.getValue(elctx);


private MasterReport createReportDefinition(URL reportDefinitionURL) throws MalformedURLException 
    try 
        ResourceManager resourceManager = new ResourceManager();
        resourceManager.registerDefaults();
        Resource directly =
            resourceManager.createDirectly(reportDefinitionURL,
                                           MasterReport.class);
        MasterReport report = (MasterReport)directly.getResource();
        return report;
     catch (ResourceException e) 
        e.printStackTrace();
    
    return null;

【讨论】:

以上是关于如何在 web 中嵌入 pentaho 报表设计器?的主要内容,如果未能解决你的问题,请参考以下文章

Pentaho 报表设计器中的参数对齐

报告,子报告 pentaho

Pentaho 7 CE 报表设计器超链接 BUG

Pentaho 报表设计器 - 动态数据源

导出到 Pentaho 报告结果到 csv 或 excel

根据用户输入在 Pentaho 报表中显示/隐藏字段