我从 *.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
的结果和值:
生成报告的 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 toJasperReport
and return it as a subreport.
关于java - 为什么从 java 添加时条件样式在子报表中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38997839/