0

我可以通过在 prpt 中预先配置(dbconntion + 查询和传递参数)并从 java 调用它来生成真实的报告。它工作正常。

问题:我想使用report.setQuery("dummyQuery","SELECT NAME,ID FROM test.person");//some query动态生成报告。这可能吗?

当我将 report.setQuery 与相同的查询一起使用时,我的报告会生成一个空白 pdf。我想我应该配置一个 HQL 数据源来实现这一点。

预配置 PRPT - 我正在显示 2 个值,名称和 ID。

我可以通过传递参数动态生成这个pdf。
请大家帮助通过 setQuery 或“如何使用 setQuery”动态生成此 pdf。
我真的很想学习生成 pentaho pdf 报告。

    package com.report;

    import java.io.File;
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    import org.pentaho.reporting.engine.classic.core.ClassicEngineBoot;
    import org.pentaho.reporting.engine.classic.core.MasterReport;
    import org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.PdfReportUtil;
    import org.pentaho.reporting.libraries.resourceloader.Resource;
    import org.pentaho.reporting.libraries.resourceloader.ResourceManager;

    /**
     * Servlet implementation class Generate
     */
    @WebServlet("/Generate")
    public class Generate extends HttpServlet {
        private static final long serialVersionUID = 1L;

        /**
         * @see HttpServlet#HttpServlet()
         */
        public Generate() {
            super();
            // TODO Auto-generated constructor stub
        }

        /**
         * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
         *      response)
         */
        protected void doGet(HttpServletRequest request,
                HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            try{
            response.reset();
            response.setContentType("application/pdf");
            ClassicEngineBoot.getInstance().start();
            ResourceManager manager = new ResourceManager();
            manager.registerDefaults();
            String PrptPath ="C:\\Users\\3692902\\Desktop\\pentahoTest.prpt";


            //generate report through pre-configured prpt (db connection + query)
            Resource res = manager.createDirectly(new File(PrptPath), MasterReport.class);
            MasterReport report = (MasterReport) res.getResource();
            report.getParameterValues().put("IDValue",101);

            //generate report through query?????
            //report.setQuery("SELECT ID FROM test.person");

            PdfReportUtil.createPDF(report,response.getOutputStream());
            }
            catch(Exception e){
                e.printStackTrace();
            }
        }

        /**
         * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
         *      response)
         */
        protected void doPost(HttpServletRequest request,
                HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
        }

    }
4

2 回答 2

0

您正在从 PRPT 文件加载报告。那么为什么不通过添加 SQL 数据源(菜单:数据->添加数据源->SQL)在报表设计器中预定义查询?

然后,假设您要按 IDValue 过滤,您可以将查询(在 PRD 内部,而不是您的代码)设置为:

SELECT ID FROM test.person WHERE ID = ${IDValue}
于 2013-03-24T12:12:24.557 回答
0

这是使用嵌入在 java 中的报告引擎生成报告的“最难”的方法。

下载与您正在使用的引擎版本匹配的 Pentaho Report Designer(例如:Pentaho Report Designer 5.4Pentaho Reporting Engine 5.4)。

从 Pentaho 报表设计器中,创建一个新报表,然后开始创建它(1. 创建您的第一个报表)创建您的连接(或您需要的任何数据源),创建您的查询,并定义您的参数。

最后,使用上面您自己的代码从 servlet 调用报告并显示它。

请记住,Pentaho 报表设计器是您在报表中定义所有需要的内容,然后只需发送参数并从任何地方生成它!

于 2015-07-17T20:41:53.680 回答