2016-08-17 3 views
4

Загрузите основной отчет и дополнительный отчет из * .jrxml и добавьте условный стиль в основной отчет и дополнительный отчет. В основной работе условного стиля отчета, но в подзаголовке это не так.Почему Условный стиль не работает в подзаголовке при добавлении его из java?

Код

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> 
+0

Вы применили 'getJasperDesign' в обоих отчетах? –

ответ

3

Вы должны запустить этот метод на основном и Вложенный отчет дизайна, стили не автоматически передаются в 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> 

Подрегистр будет загружен в JasperDesign, вы примените к нему свои стилей, а затем скомпилируете его на JasperReport и вернете его как подзаголовок.

+0

ну, я уже пробовал это, единственное отличие в том, что я добавляю subreport как параметр, а не как результат метода. И это не работает для моих условных стилей – quento

+0

@quento, в основном вам нужно разрешить дизайн подрепортажа проходить через тот же метод, что и основной отчет, если вы добавляете subreports в качестве параметра, добавляете его как объект JasperReport или как «..pathToSubReport .. « –

+0

Я делаю все так, называя те же методы для обоих подписок и основного отчета. Я даже получаю одинаковые шрифты, но ничего не возникает в подзаголовке. – quento

Смежные вопросы