java - 为什么从 java 添加时条件样式在子报表中不起作用?

标签 java jasper-reports dynamic-reports

我从 *.jrxml 加载主报表和子报表,并向主报表和子报表添加条件样式。在主报表中条件样式有效,但在子报表中无效。

代码

public static JasperDesign getJasperDesign(InputStream isReport) throws JRException {
    JasperDesign jasperDesign = JRXmlLoader.load(isReport);

    // rootStyle
    JRDesignStyle jrDesignRootStyle = (JRDesignStyle) dynamicReportToJasperReportConverter.convertStyle(Template.rootStyle.getStyle());
    jrDesignRootStyle.setName("rootStyle");
    jasperDesign.addStyle(jrDesignRootStyle);

    //creatConditional Style
    JRDesignStyle jrDesignStyle = (JRDesignStyle) dynamicReportToJasperReportConverter.convertStyle(Template.columnStyle.getStyle());
    jrDesignStyle.setName("columnStyle");
    jrDesignStyle.setParentStyle(jrDesignRootStyle);
    JRDesignConditionalStyle jrDesignConditionalStyle = new JRDesignConditionalStyle();
    JRDesignExpression conditionExpression = new JRDesignExpression();
    conditionExpression.setValueClassName(String.valueOf(Boolean.class));
    conditionExpression.setText("$V{REPORT_COUNT}%2 == 1");
    jrDesignConditionalStyle.setConditionExpression(conditionExpression);
    jrDesignConditionalStyle.setBackcolor(Template.valueColor2);
    jrDesignStyle.addConditionalStyle(jrDesignConditionalStyle);
    jasperDesign.addStyle(jrDesignStyle);
    return jasperDesign;
}

在图片中,您可以看到 REPORT_COUNT 的结果和值:

Result main report and sub report

生成报告的 Java 代码

 JasperReport jasperSubReportIC = TemplateConfigurator.buildSubReport(isSubReportIC, subQueryTO);
        return Template.getReport(reportParameters.getOutputType(),sheetNameInExcel)
                .setTemplate(Template.reportTemplate)
                .title(Template.createTitleHeader(reportName, dateText, bundle, reportContext, reportParameters))
                .lastPageFooter(Template.createFooter(dateText, bundle))
                .setParameter("subreportParameterTO", jasperSubReportTO)
                .setParameter("subreportParameterIC", jasperSubReportIC)
                .setParameter("subQueryTO", subQueryTO)
                .setParameter("subQueryIC", subQueryIC)
                .setParameter("CONTEXT", super.reportContext)
                .setLocale(locale)
                .setResourceBundle(bundle)
                .setTemplateDesign(TemplateConfigurator.getJasperDesign(is))
                .setDataSource(query, DatabaseConnection.getConnection())
                .show()
                .toJasperPrint();

实现子报告的 JRXML 代码

<subreport>
            <reportElement x="0" y="0" width="802" height="49" uuid="50369a11-d831-4c54-b16f-95fbed8b5bba"/>
            <subreportParameter name="REPORT_LOCALE">
                <subreportParameterExpression><![CDATA[$P{REPORT_LOCALE}]]></subreportParameterExpression>
            </subreportParameter>
            <subreportParameter name="TO_ID">
                <subreportParameterExpression><![CDATA[$F{TO_ID}]]></subreportParameterExpression>
            </subreportParameter>
            <subreportParameter name="REPORT_RESOURCE_BUNDLE">
                <subreportParameterExpression><![CDATA[$P{REPORT_RESOURCE_BUNDLE}]]></subreportParameterExpression>
            </subreportParameter>
            <dataSourceExpression><![CDATA[$P{dataScriplet_SCRIPTLET}.createDataSourceTO($P{REPORT_CONNECTION},$P{subQueryTO},$F{TO_ID})]]></dataSourceExpression>
            <subreportExpression><![CDATA[$P{subreportParameterTO}]]></subreportExpression>
        </subreport>

最佳答案

您需要在主报表和子报表设计上运行此方法,样式不会自动传递到子报表。

您也无法从主报表设计访问子报表设计,请参阅 How to get subreport name from JasperReport object (.jasper compiled file) via API?

最简单的方法可能是在你的类 YourClass 中包含另一个静态方法

public static JasperReport getSubreport(String fileName) throws JRException, FileNotFoundException{
    JasperDesign jd = getJasperDesign(new FileInputStream(fileName));
    return JasperCompileManager.compileReport(jd);
}

并在您的主报表中使用此表达式调用子报表

<subreportExpression class="net.sf.jasperreports.engine.JasperReport">
    <![CDATA[my.package.YourClass.getSubreport("..pathToSubReport..")]]>
</subreportExpression>

The subreport will be loaded into JasperDesign, you apply your styles to it, then compile it to JasperReport and return it as a subreport.

关于java - 为什么从 java 添加时条件样式在子报表中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38997839/

相关文章:

jasper-reports - Jasper Reports 中的 isPDFEmbedded 标签

java.lang.ClassNotFoundException : org. apache.commons.digester.Rule

java - Jasperreports 引擎 JRRuntimeException on report().show

java - 在特定方法中禁用 spring 安全认证

java - 匹配任何字符串正则表达式

java - Jasper子报告错误

java - Jasper 报表排除表中的列标题?

java - 动态报告 : How to import the libraries to use with NetBeans in a new project?

java - 大文件的 Wiremock withBodyFile OutOfMemoryError

java - 等效于 ObjectOutputStream,不仅保存其状态而且保存整个对象?