java - 如何使用java代码在主报表中添加子报表

标签 java jasper-reports

我正在使用 java 创建 jasper pdf。我想将子报表动态添加到主报表中。

主要报告是使用以下代码创建的:

JasperDesign jasperDesign = JRXmlLoader.load("/home/report1.jrxml");
    jasperDesign.setName("sampleDynamicJasperDesign");
    jasperDesign.setPageWidth(595);jasperDesign.setPageHeight(842);jasperDesign.setColumnWidth(595-40-40);jasperDesign.setColumnSpacing(0);
    jasperDesign.setLeftMargin(40);jasperDesign.setRightMargin(40);jasperDesign.setTopMargin(20);jasperDesign.setBottomMargin(20);

    JRDesignStyle normalStyle = new JRDesignStyle();
    normalStyle.setName("Noto Sans");normalStyle.setDefault(true); normalStyle.setFontName("Noto Sans");normalStyle.setFontSize(12);normalStyle.setPdfFontName("Helvetica");normalStyle.setPdfEncoding("Cp1252");normalStyle.setPdfEmbedded(false);jasperDesign.addStyle(normalStyle);
((JRDesignSection) jasperDesign.getDetailSection()).addBand(createHeaderSubreport(parameters));

//创建子报表

    private JRBand createHeaderSubreport(Map<String, Object> parameters) throws JRException {

    JasperDesign jasperDesign = new JasperDesign(); 
    jasperDesign.setLanguage("java");
    jasperDesign.setPageWidth(595); jasperDesign.setPageHeight(842);jasperDesign.setColumnWidth(595-40-40);jasperDesign.setColumnSpacing(0);jasperDesign.setLeftMargin(40);jasperDesign.setRightMargin(40);jasperDesign.setTopMargin(20); jasperDesign.setBottomMargin(20);
    jasperDesign.setTitle(null);jasperDesign.setColumnHeader(null);

    JRDesignParameter designParameter = new JRDesignParameter(); designParameter.setName("LeftText");designParameter.setValueClass(String.class);
    jasperDesign.addParameter(designParameter);
    JRDesignStyle normalStyle = new JRDesignStyle();
    normalStyle.setName("Noto Sans");normalStyle.setDefault(true);normalStyle.setFontName("Noto Sans");normalStyle.setFontSize(12); normalStyle.setPdfFontName("Helvetica");normalStyle.setPdfEncoding("Cp1252"); normalStyle.setPdfEmbedded(false);jasperDesign.addStyle(normalStyle);

    JRDesignBand band = new JRDesignBand();
    band.setHeight(50);

    JRDesignStaticText designStaticText = new JRDesignStaticText();
    designStaticText.setText("Header");
    designStaticText.setHeight(10);
    designStaticText.setWidth(100);
    designStaticText.setX(0);designStaticText.setY(0);
    band.addElement(designStaticText);

    JRDesignTextField jrDesignTextField = new JRDesignTextField();
    JRDesignExpression jrExpression = new JRDesignExpression();
    jrExpression.setText("$P{LeftText}");
    jrDesignTextField.setExpression(jrExpression);
    jrDesignTextField.setY(0);
    jrDesignTextField.setHeight(20);
    jrDesignTextField.setWidth((38*515)/100);
    jrDesignTextField.setMarkup("html");
    jrDesignTextField.setHorizontalTextAlign(HorizontalTextAlignEnum.LEFT);
    jrDesignTextField.setStretchWithOverflow(true);
    band.addElement(jrDesignTextField);

    ((JRDesignSection) jasperDesign.getDetailSection()).addBand(band);

    JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);

    JRDesignSubreport jSubreport = new JRDesignSubreport(jasperDesign); 
    jSubreport.setUsingCache(false); 
    jSubreport.setRemoveLineWhenBlank(true); 
    jSubreport.setPrintRepeatedValues(false);
    jSubreport.setWidth(500);
    jSubreport.setHeight(80);
    jSubreport.setX(0);jSubreport.setY(0);

    JRDesignExpression expression = new JRDesignExpression();
    expression.setText("new net.sf.jasperreports.engine.JREmptyDataSource(1)");
    jSubreport.setDataSourceExpression(expression);        
    jSubreport.setExpression(expression);

    JRDesignSubreportParameter designSubreportParameter = new JRDesignSubreportParameter();  designSubreportParameter.setName("REPORT_CONNECTION");    
    JRDesignExpression exp = new JRDesignExpression("$P{REPORT_CONNECTION}");  designSubreportParameter.setExpression(exp);
    jSubreport.addParameter(designSubreportParameter);


    designSubreportParameter = new JRDesignSubreportParameter();  designSubreportParameter.setName("LeftText"); 
  exp = new JRDesignExpression("$P{LeftText}");  designSubreportParameter.setExpression(exp);
  jSubreport.addParameter(designSubreportParameter);

    band = new JRDesignBand();
    band.setHeight(80);
    band.addElement(jSubreport);
    return band;
}

然后在编译和填写主报表后,子报表打印为空白。但单独的子报表可以工作。

即使我尝试将 dataSourceExpression 作为 new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{notes}) 传递,其打印仍然是空白。

我没有明白我错在哪里,请帮忙

最佳答案

编译您的设计。

JasperReport subReport = JasperCompileManager.compileReport(subJasperDesign);

然后将其作为参数添加到您的主报告中。

parameters.put("SUB_TEMPLATE", subReport);

在 jrxml 模板中获取此参数:

<parameter name="SUB_TEMPLATE" class="net.sf.jasperreports.engine.JasperReport"/>

最后是该参数的 jrxml 使用示例:

<band height="15">
<subreport>
<reportElement x="0" y="0" width="802" height="15" />
<dataSourceExpression><![CDATA[$F{SUB_DATASOURCE_NAME}]]></dataSourceExpression>
<subreportExpression><![CDATA[$P{SUB_TEMPLATE}]]></subreportExpression>
/subreport>
</band>

关于java - 如何使用java代码在主报表中添加子报表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39731017/

相关文章:

Java 8 lambda、Function.identity() 或 t->t

jasper-reports - 当关联查询没有记录时在 iReport 中打印空表

java - Jasper 报告 - 使用 BLOB 作为详细信息字段时出现 java.lang.ClassNotFoundException : oracle. jdbc.OracleBlob

java - JasperReports 字体扩展 +~JF*****.tmp 文件

java - 将SubjectPublicKeyInfo格式的公钥转换为RSAPublicKey格式java

java - 自动完成元组

java - 数据库时间戳不匹配

java - Play 框架中的远程处理

jasper-reports - 使用列表列表创建子报表

java - 在 jasper 报告中多次重复所有列