Reputation: 3147
When printing the sub reports in Main Report.
I am using Jasper API for creating main report and adding the compiled sub report in the main report. Main report is compiling fine. But graphs are repeated the number of data in the data source.
If Data source (My data source is JRBeanCollectionDataSource) has 6 then it prints 2 set of 2 overlapping graph and 2 graphs below it
I am calling Sub reports from Group section of report Class to design Main report
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;
}
}
Class to compile sub report and Fill and generate 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));
}
}
List Data provider Beans
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;
}
}
Sub report 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>
Sub report 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>
Page 1 of generated Report 2 Set of Overlapping time series graphs
Page 2 of generated Report 2 individual time series graphs
Page 3 of Generate Report 2 Set of overlapping Bar graphs
Page 4 of Generated Report 2 Set of individual bar graphs
Upvotes: 1
Views: 716
Reputation: 3548
Remove group expression $F{count} from
<groupExpression><![CDATA[$F{count}]]></groupExpression>
If this does not work then remove the whole group expression line from both main and subreport.
Upvotes: 2