有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用JasperReports为单个报表传递多个结果集?

在我的报告中,我有一组字段和两个数据集。我想一次执行三个过程来运行报告。第一个过程用于执行字段集,其余两个过程用于数据集。我通过一个结果集来执行一个工作正常的报告。但是我想从execute()和port()方法中再传递两个resultset。是否可以使用JResultSetDataSource或任何其他选项传递多个resultset

public ResultSet execute() throws ClassNotFoundException {
    Statement stmt;
    ResultSet resultset = null;
    Connection con = null;
    try {
        String selectstatement = "CALL P_Select_Salary2 ('2013-01-01', '2013-01-31', 1, 'Salary_OA')";
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection("jdbc:mysql://localhost:3306/compliance?user=root&password=root");
        stmt = con.createStatement();
        resultset = stmt.executeQuery(selectstatement);

    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        close(con);
        close(resultset);
    }
    return resultset;
}

public ResultSet port() throws ClassNotFoundException {
    Statement stmt;
    ResultSet resultset = null;
    Connection con = null;
    try {
        String selectstatement = "CALL P_Select_Salary3 ('2013-01-01', '2013-01-31', 1, 'Salary')";
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection("jdbc:mysql://localhost:3306/compliance?user=root&password=root");
        stmt = con.createStatement();
        resultset = stmt.executeQuery(selectstatement);

    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        close(con);
        close(resultset);
    }
    return resultset;
}

public void generateReport() {
    Connection connection = null;
    Statement stmt;
    ResultSet resultset = null;
    try {
        String selectstatement = "CALL P_Select_Salary ('2013-01-01', '2013-02-28', 1, 'Salary_Summary')";
        Class.forName("com.mysql.jdbc.Driver");
        connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/compliance?user=root&password=root");
        stmt = connection.createStatement();
        resultset = stmt.executeQuery(selectstatement);
        JRResultSetDataSource resultsetdatasource = new JRResultSetDataSource(resultset);
        String realpath = FacesContext.getCurrentInstance().getExternalContext().getRealPath("common/reports/wageslip.jasper");
        jasperprint = JasperFillManager.fillReport(realpath, new HashMap(), resultsetdatasource);
        HttpServletResponse httpservlet = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
        httpservlet.addHeader("Content-disposition", "attachment;filename=wageslip.pdf");
        ServletOutputStream servletout = httpservlet.getOutputStream();
        JasperExportManager.exportReportToPdfStream(jasperprint, servletout);
        FacesContext.getCurrentInstance().responseComplete();
    } catch (net.sf.jasperreports.engine.JRException JRexception) {
        logger.info("JRException Exception" + JRexception.getMessage());
        JsfUtil.addErrorMessage("No Datas between FromDate and ToDate");
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        close(connection);
        close(resultset);
    }
}

共 (1) 个答案

  1. # 1 楼答案

    可以在参数映射中发送任意多个结果集

    Map reportParams = new HashMap(); reportParams.put("ds1", new JRBeanCollectionDataSource(beanCollection1)); reportParams.put("ds2", new JRBeanCollectionDataSource(beanCollection2));

    JasperPrint jrprint = JasperFillManager.fillReport(jasperReport,reportParams, new JREmptyDataSource());

    确保在报告中使用相同的名称(ds1、ds2)声明参数,并将ParameterClass设置为

    net.sf.jasperreports.engine.data.JRBeanCollectionDataSource

    现在可以用$p{ds1}、$p{ds2}等来检索它们。 您还没有指定需要它们做什么,但实际上可以使用这些参数做任何事情,比如设置其中一个参数或表的数据源等

    评论后编辑

    我有一个列表组件,我将其设置为Connection/Datasource Expression=$P{list1}, 其中,$P{list1}是net.sf.jasperreports.engine.JRResultSetDataSource类型的参数

    我的列表组件如下所示:

    <jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" printOrder="Vertical">
                        <datasetRun subDataset="dataset1">
                            <dataSourceExpression><![CDATA[$P{ds1}]]></dataSourceExpression>
                        </datasetRun>
                        <jr:listContents height="66" width="400">
                            <textField>
                                <reportElement x="10" y="10" width="100" height="20"/>
                                <textElement/>
                                <textFieldExpression><![CDATA[$F{empname}]]></textFieldExpression>
                            </textField>
                        </jr:listContents>
                    </jr:list>
    

    如你所见,我有元素 Dataset1是添加列表组件时自动添加到报表中的数据集(如果使用iReport进行设计)。 现在,在dataset1下(正如我所说,它是一个子数据集,所以它允许参数、字段和变量),我声明字段:

    <subDataset name="dataset1">
            <field name="empno" class="java.lang.Integer"/>
            <field name="empname" class="java.lang.String"/>
        </subDataset>
    

    就这样。我已经尝试过这个确切的代码,对我有效