Yes, .jrxml files are not required at all, but on the other hand, there might be some default report sections which don't need to be changed, so why not design those using iReport, load them with JRXmlLoader and then modify the resulting JasperDesign object? Anyway, there are static methods JRXmlLoader.load() which take either a File object, an InputStream or a String (name of a .jrxml file), which return a JasperDesign object that contains all the attributes and elements of the xml file. You could also just instantiate JasperDesign manually and then fill it with appropriate content. It does involve a lot of work but it is not complex or hard to understand. If you understand the elements and attributes from the Jasper XML scheme, then all the classes from net.sf.jasperreports.engine.design.* should be rather self-explanatory. For example, if you have a JasperDesign object like this JasperDesign jdes = new JasperDesign(); then you can add fields from your datasource like this: JRDesignField field = new JRDesignField(); field.setName("ADDRESS"); field.setValueClassName("java.lang.String"); jdes.addField(field); All the sections of a report (headers, footers, detail, title, summary) are defined by instantiating JRDesignBand object, set ting its height and adding report elements to it (JRDesignTextField, JRDesignLine, JRDesignWhatever) like this: JRDesignBand detail = new JRDesignBand(); detail.setHeight(16); // in points, 1/72 of an inch JRDesignTextField tf = new JRDesignTextField(); tf.setXXX(...); // set its various atributes detail.addElement(tf); // add the field to the band jas.setDetail(detail); // set the band as report detail section Anyway, there is a lot more to this, but you need to experiment on your own. Or buy the JasperReports Ultimate Guide. :) (I didn't buy it myself though, as reading API documentation or even source code seems enough for my needs) Have fun.