子报告中的多个图表

时间:2014-05-09 09:25:55

标签: java jasper-reports

在主报告中打印子报告时。

我使用Jasper API创建主报表并在主报表中添加已编译的子报表。 主要报告正在编制中。但是图表会重复数据源中的数据。

如果数据源(我的数据源是JRBeanCollectionDataSource)有6,那么它会打印2组2个重叠图和2个图下面的图

我正在从报告的“组”部分调用“子报告” 设计类主报告

public class JasperDesignForTemplate {
    public JasperDesign design() throws Exception {

        // set basic design for main report
        JasperDesign jasperDesign = new JasperDesign();
        jasperDesign.setName("simpleReport");
        jasperDesign.setPageWidth(595);
        jasperDesign.setPageHeight(842);
        jasperDesign.setColumnWidth(270);
        jasperDesign.setColumnSpacing(15);
        jasperDesign.setLeftMargin(20);
        jasperDesign.setRightMargin(20);
        jasperDesign.setTopMargin(30);
        jasperDesign.setBottomMargin(30);    

        //Parameters

        // field
        JRDesignField bar = new JRDesignField();
        bar.setName("bar");
        bar.setValueClass(java.util.List.class);
        jasperDesign.addField(bar);

        JRDesignField time = new JRDesignField();
        time.setName("time");
        time.setValueClass(java.util.List.class);
        jasperDesign.addField(time);

        JRDesignBand band = new JRDesignBand();

        //Group
        JRDesignGroup group = new JRDesignGroup();
        group.setName("Chart group");

        band = new JRDesignBand();
        band.setHeight(250);
        band.setSplitType(SplitTypeEnum.STRETCH);

        JRDesignSubreport jSubreport = new JRDesignSubreport(jasperDesign); 
        jSubreport.setUsingCache(false); 
        jSubreport.setRemoveLineWhenBlank(true); 
        jSubreport.setPrintRepeatedValues(false);

        JRDesignExpression expression = new JRDesignExpression();
        expression.setText("new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{time})");

        jSubreport.setDataSourceExpression(expression);

        expression = new JRDesignExpression(); 
        expression.setText("\"/path/to/TimeSeriesChartSubReport.jasper\"");

        jSubreport.setExpression(expression);
        band.addElement(jSubreport);

        ((JRDesignSection)group.getGroupHeaderSection()).addBand(band);
        jasperDesign.addGroup(group);

        JRDesignGroup Chartgroup = new JRDesignGroup();
        Chartgroup.setName("Chart group Chart");

        JRDesignBand chartband = new JRDesignBand();
        chartband.setHeight(250);
        chartband.setSplitType(SplitTypeEnum.STRETCH);

        JRDesignSubreport jSubreportChart = new JRDesignSubreport(jasperDesign); 
        jSubreportChart.setUsingCache(false); 
        jSubreportChart.setRemoveLineWhenBlank(true); 

        JRDesignExpression expressionChart = new JRDesignExpression();
        expressionChart.setText("new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{bar})");

        jSubreportChart.setDataSourceExpression(expressionChart);

        expressionChart = new JRDesignExpression(); 
        expressionChart.setText("\"/path/to/BarCharSubReport.jasper\"");

        jSubreportChart.setExpression(expressionChart);
        chartband.addElement(jSubreportChart);

        ((JRDesignSection)Chartgroup.getGroupHeaderSection()).addBand(chartband);
        jasperDesign.addGroup(Chartgroup);


        // title band
        band = new JRDesignBand();
        band.setHeight(20);
        band.setSplitType(SplitTypeEnum.STRETCH);

        JRDesignStaticText staticText = new JRDesignStaticText();
        staticText.setX(0);
        staticText.setY(0);
        staticText.setHeight(20);
        staticText.setWidth(550);
        staticText.setText("Report Name");
        staticText.setHorizontalAlignment(HorizontalAlignEnum.CENTER);
        staticText.setFontSize(15);
        band.addElement(staticText);
        jasperDesign.setTitle(band);
        // end of title band

        // page header band
        band = new JRDesignBand();
        band.setHeight(50);
        band.setSplitType(SplitTypeEnum.STRETCH);
        jasperDesign.setPageHeader(band);
        // end of page header band

        // column header band
        band = new JRDesignBand();
        band.setHeight(50);
        band.setSplitType(SplitTypeEnum.STRETCH);
        jasperDesign.setColumnHeader(band);
        // end of column header band

        //detail band
        band = new JRDesignBand();
        band.setHeight(20);
        ((JRDesignSection) jasperDesign.getDetailSection()).addBand(band);
        // end of detail band

        // column footer band
        band = new JRDesignBand();
        band.setHeight(20);
        jasperDesign.setColumnFooter(band);
        // end of column footer band

        // page footer band
        band = new JRDesignBand();
        band.setHeight(20);
        jasperDesign.setPageFooter(band);
        // end of page footer band

        // summary band
        band = new JRDesignBand();
        band.setHeight(20);
        jasperDesign.setSummary(band);
        // end of summary band

        return jasperDesign;
    }
}

编译子报告和填写并生成PDF的类

public class DynamicJasper {
    protected JasperPrint jp;
    protected JasperReport jr;
    protected Map params = new HashMap();
    private static String inputjrxml = "/path/to/Report.jrxml";
    private static String outputjasper = "/path/to/Report.jasper";
    private static String pdffile = "/path/to/Report.pdf";


    public static void main(String args[]) throws Exception{

        String inputTimeSubreport = "/path/to/TimeSeriesChartSubReport.jrxml";
        String outputTimeSubreport = "/path/to/TimeSeriesChartSubReport.jasper";

        String inputBarSubreport = "/path/to/BarCharSubReport.jrxml";
        String outputBarSubreport = "/path/to/BarCharSubReport.jasper";

        JasperCompileManager.compileReportToFile(inputTimeSubreport, outputTimeSubreport);
        JasperCompileManager.compileReportToFile(inputBarSubreport, outputBarSubreport);

        JasperDesignForTemplate templace = new JasperDesignForTemplate();
        JasperDesign design = templace.design();
        Collection<JRValidationFault> faults = JasperCompileManager.verifyDesign(design);
        JasperCompileManager.compileReportToFile(design, outputjasper);

        HashMap<String, Object> params = new HashMap<String, Object>();

        EventData data = new EventData();

        JRBeanCollectionDataSource beanList = new JRBeanCollectionDataSource(data.getEventData());
        JasperPrint jasperPrint = JasperFillManager.fillReport(outputjasper, params, beanList);
        JasperExportManager.exportReportToPdfStream(jasperPrint, new FileOutputStream(pdffile));
    }
}

列出数据提供者Bean

public class EventBean {
    private String field;
    private String count;
    private String pastcount;
    private List<TimeSeriesBean> time = new ArrayList<TimeSeriesBean>();

    public EventBean(){

    }

    public EventBean(String name, String count, String pastCount, List<TimeSeriesBean> time){
        this.field = name;
        this.count = count;
        this.time = time;
        this.pastcount = pastCount;
    }

    public String getField() {
        return field;
    }
    public void setName(String name) {
        this.field = name;
    }
    public String getCount() {
        return count;
    }
    public void setCount(String count) {
        this.count = count;
    }

    public List<TimeSeriesBean> getTime() {
        return time;
    }

    public void setTime(List<TimeSeriesBean> time) {
        this.time = time;
    }

    public void setField(String field) {
        this.field = field;
    }

    public String getPastcount() {
        return pastcount;
    }

    public void setPastcount(String pastcount) {
        this.pastcount = pastcount;
    }

}

public class TimeSeriesBean {
    private String count;
    private String timeStamp;

    public TimeSeriesBean(String count, String timeStamp) {
        this.count = count;
        this.timeStamp = timeStamp;
    }
    public TimeSeriesBean() {

    }
    public String getCount() {
        return count;
    }
    public void setCount(String count) {
        this.count = count;
    }
    public String getTimeStamp() {
        return timeStamp;
    }
    public void setTimeStamp(String timeStamp) {
        this.timeStamp = timeStamp;
    }


}

public class EventData {
    private List<EventBean> bar;

    private List<TimeSeriesBean> time;

    public List<EventBean> getBar() {
        return bar;
    }

    public void setBar(List<EventBean> bar) {
        this.bar = bar;
    }

    public List<TimeSeriesBean> getTime() {
        return time;
    }

    public void setTime(List<TimeSeriesBean> time) {
        this.time = time;
    }

    public List<EventData> getEventData(){
        ArrayList<EventData> dataArr = new ArrayList<EventData>();

        EventData data = new EventData();
        EventNameList dataList = new EventNameList();

        data.setBar(dataList.getDataBeanList());
        data.setTime(dataList.getSingleDataBeanList().get(0).getTime());

        dataArr.add(data);
        return dataArr;
    }
}


public class EventNameList {
    public ArrayList<EventBean> getSingleDataBeanList() {
        ArrayList<EventBean> list = new ArrayList<EventBean>();

        ArrayList<TimeSeriesBean> listTime = new ArrayList<TimeSeriesBean>();
        TimeSeriesBean tbean = new TimeSeriesBean("413","1375951800");
        TimeSeriesBean tbean1 = new TimeSeriesBean("425","1375952100");
        TimeSeriesBean tbean2 = new TimeSeriesBean("396","1375952820");
        TimeSeriesBean tbean3 = new TimeSeriesBean("400","1375953540");
        TimeSeriesBean tbean4 = new TimeSeriesBean("200","1375953440");
        TimeSeriesBean tbean5 = new TimeSeriesBean("1400","1375953999");
        listTime.add(tbean);
        listTime.add(tbean1);
        listTime.add(tbean2);
        listTime.add(tbean3);
        listTime.add(tbean4);
        listTime.add(tbean5);

        list.add(generate("Flow", "100", "800", listTime));

        return list;
    }

    public ArrayList<EventBean> getDataBeanList() {
        ArrayList<EventBean> list = new ArrayList<EventBean>();

        ArrayList<TimeSeriesBean> listTime = new ArrayList<TimeSeriesBean>();
        TimeSeriesBean tbean = new TimeSeriesBean("413","1375951800");
        TimeSeriesBean tbean1 = new TimeSeriesBean("425","1375952100");
        TimeSeriesBean tbean2 = new TimeSeriesBean("396","1375952820");
        TimeSeriesBean tbean3 = new TimeSeriesBean("400","1375953540");
        TimeSeriesBean tbean4 = new TimeSeriesBean("400","1375953440");
        TimeSeriesBean tbean5 = new TimeSeriesBean("400","1375953999");
        listTime.add(tbean);
        listTime.add(tbean1);
        listTime.add(tbean2);
        listTime.add(tbean3);
        listTime.add(tbean4);
        listTime.add(tbean5);

        list.add(generate("Flow", "100", "800", null));
        list.add(generate("Non flow", "200", "50", null));
        list.add(generate("Allow", "600", "400", null));
        list.add(generate("Deny", "50", "200", null));
        list.add(generate("Block", "150", "1200", null));
        list.add(generate("Access", "10", "0", null));

        return list;
    }

    private EventBean generate(String name, String country, String pastCount, List<TimeSeriesBean> time) {
        EventBean bean = new EventBean();
        bean.setName(name);
        bean.setCount(country);
        bean.setPastcount(pastCount);
        bean.setTime(time);
        return bean;
    }
}

子报告JRXML for Time series graph

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="ProductReport" columnCount="2" pageWidth="325" pageHeight="842" whenNoDataType="NoDataSection" columnWidth="160" columnSpacing="5" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0">
    <field name="count" class="java.lang.String"/>
    <field name="timeStamp" class="java.lang.String"/>
    <group name="TimeSeriesGroup">
        <groupExpression><![CDATA[$F{count}]]></groupExpression>
        <groupHeader>
            <band height="250">
                <timeSeriesChart>
                    <chart evaluationTime="Report">
                        <reportElement x="0" y="25" width="550" height="175"/>
                        <chartTitle/>
                        <chartSubtitle/>
                        <chartLegend/>
                    </chart>
                    <timeSeriesDataset timePeriod="Minute">
                        <dataset incrementType="None"/>
                        <timeSeries>
                            <seriesExpression><![CDATA["Count"]]></seriesExpression>
                            <timePeriodExpression><![CDATA[new Date(Long.valueOf($F{timeStamp})*1000)]]></timePeriodExpression>
                            <valueExpression><![CDATA[Integer.valueOf($F{count})]]></valueExpression>
                        </timeSeries>
                    </timeSeriesDataset>
                    <timeSeriesPlot isShowLines="true" isShowShapes="false">
                        <plot/>
                        <timeAxisFormat>
                            <axisFormat>
                                <labelFont/>
                                <tickLabelFont/>
                            </axisFormat>
                        </timeAxisFormat>
                        <valueAxisFormat>
                            <axisFormat>
                                <labelFont/>
                                <tickLabelFont/>
                            </axisFormat>
                        </valueAxisFormat>
                    </timeSeriesPlot>
                </timeSeriesChart> 
            </band>
        </groupHeader>
        <groupFooter>
            <band/>
        </groupFooter>
    </group>
</jasperReport>

子报告JRXML for Bar chart

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="ProductReport" columnCount="2" pageWidth="325" pageHeight="842" whenNoDataType="NoDataSection" columnWidth="160" columnSpacing="5" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0">
    <field name="count" class="java.lang.String"/>
    <field name="field" class="java.lang.String"/>
    <field name="pastcount" class="java.lang.String"/>
    <group name="BarChartGroup">
        <groupExpression><![CDATA[$F{count}]]></groupExpression>
        <groupHeader>
            <band height="250">
                <bar3DChart>
                    <chart evaluationTime="Report">
                        <reportElement x="0" y="0"  width="555" height="233" isRemoveLineWhenBlank="true"/>                 
                        <chartTitle/>
                        <chartSubtitle/>
                        <chartLegend position="Right"/>
                    </chart>
                    <categoryDataset>
            <dataset incrementType="None"/>
            <categorySeries>
                <seriesExpression><![CDATA["This month"]]></seriesExpression>
              <categoryExpression><![CDATA[$F{field}]]></categoryExpression>
              <valueExpression><![CDATA[Integer.valueOf($F{count})]]></valueExpression>
            </categorySeries>
                        <categorySeries>
                <seriesExpression><![CDATA["Last month"]]></seriesExpression>
              <categoryExpression><![CDATA[$F{field}]]></categoryExpression>
              <valueExpression><![CDATA[Integer.valueOf($F{pastcount})]]></valueExpression>
            </categorySeries>
                    </categoryDataset>
                    <bar3DPlot>
                        <plot/>
                        <itemLabel/>
                        <categoryAxisFormat>
                            <axisFormat/>
                        </categoryAxisFormat>
                        <valueAxisFormat>
                            <axisFormat/>
                        </valueAxisFormat>
                    </bar3DPlot>
                </bar3DChart>
            </band>
        </groupHeader>
        <groupFooter>
            <band/>
        </groupFooter>
    </group>
</jasperReport>

生成的报告的第1页2重叠时间序列图集 2 Set of overlapping graphs 生成的报告2的第2页个别时间序列图 2 separate graphs 生成报告的第3页2重叠条形图集 2 Set of overlapping Bar graphs 生成的报告第4页2个别条形图集 2 individual bar graphs

1 个答案:

答案 0 :(得分:2)

中删除组表达式$ F {count}
<groupExpression><![CDATA[$F{count}]]></groupExpression>

如果这不起作用,则从主报表和子报表中删除整个组表达式行。