Olá

Que tal fazer um relatório sem iReport? e sem ter de fazer o JRXML? e ser montada de dinamicamente?

Pois isso é possível usando algumas classes do JasperReports como a JasperDesign, JRDesignBand, JRDesignStaticText, JRDesignField e JRDesignExpression. Não é muito complicado fazer isso não como você podem ver no exemplo que fiz, o mais díficil mesmo é posicionar os elementos na página. Precisa usar muito a imaginação.

Basicamente é feito tudo pela classe abaixo.

package br.com.furutani.reldin;
import java.awt.Color;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.design.JRDesignBand;
import net.sf.jasperreports.engine.design.JRDesignExpression;
import net.sf.jasperreports.engine.design.JRDesignField;
import net.sf.jasperreports.engine.design.JRDesignStaticText;
import net.sf.jasperreports.engine.design.JRDesignTextField;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.type.HorizontalAlignEnum;
public class ReportDesigner {
public JasperDesign getDesign() throws JRException {
// Cria um novo relatório
JasperDesign jasperDesign = new JasperDesign();
// PAGE
configPage(jasperDesign);
// FIELD
JRDesignField field = null;
addField("referencia", String.class, jasperDesign);
addField("consumo", Integer.class, jasperDesign);
// TITLE
JRDesignBand jrDesignband = null;
JRDesignStaticText staticText = null;
configTitle(jasperDesign);
// PAGE HEADER
jrDesignband = new JRDesignBand();
jrDesignband.setHeight(15);
jasperDesign.setPageHeader(jrDesignband);
// COLUMN HEADER
jrDesignband = new JRDesignBand();
jrDesignband.setHeight(25);
jasperDesign.setColumnHeader(jrDesignband);
//Dados da referencia
staticText = new JRDesignStaticText();
staticText.setX(0);
staticText.setY(5);
staticText.setWidth(150);
staticText.setHeight(15);
staticText.setHorizontalAlignment(HorizontalAlignEnum.LEFT);
staticText.setText("Referência - Mês/Ano");
staticText.setBold(true);
jrDesignband.addElement(staticText);
//Dados do consumo
staticText = new JRDesignStaticText();
staticText.setX(150);
staticText.setY(5);
staticText.setWidth(100);
staticText.setHeight(15);
staticText.setHorizontalAlignment(HorizontalAlignEnum.RIGHT);
staticText.setText("Consumo - kWh");
staticText.setBold(true);
jrDesignband.addElement(staticText);
// DETAIL
jrDesignband = new JRDesignBand();
jrDesignband.setHeight(20);
//Dados da referencia
JRDesignTextField textField = new JRDesignTextField();
textField.setBlankWhenNull(false);
textField.setX(0);
textField.setY(5);
textField.setWidth(150);
textField.setHeight(15);
// Adiciona a expressao no campo
JRDesignExpression expression = new JRDesignExpression();
expression.setValueClass(java.lang.String.class);
expression.setText("$F{referencia}");
textField.setExpression(expression);
jrDesignband.addElement(textField);
//Dados do consumo
textField = new JRDesignTextField();
textField.setBlankWhenNull(false);
textField.setX(200);
textField.setY(5);
textField.setWidth(50);
textField.setHeight(15);
textField.setHorizontalAlignment(HorizontalAlignEnum.RIGHT);
//Adiciona a expressao no campo
expression = new JRDesignExpression();
expression.setValueClass(java.lang.Integer.class);
expression.setText("$F{consumo}");
textField.setExpression(expression);
jrDesignband.addElement(textField);
jasperDesign.setDetail(jrDesignband);
// COLUMN FOOTER (Escondido)
jrDesignband = new JRDesignBand();
jrDesignband.setHeight(0);
jasperDesign.setColumnFooter(jrDesignband);
// PAGE FOOTER (Escondido)
jrDesignband = new JRDesignBand();
jrDesignband.setHeight(0);
jasperDesign.setPageFooter(jrDesignband);
// NO DATA (No JasperViewer não mostra, na web mostraria)
jrDesignband = new JRDesignBand();
jrDesignband.setHeight(20);
staticText = new JRDesignStaticText();
staticText.setX(10);
staticText.setY(5);
staticText.setWidth(64);
staticText.setHeight(15);
staticText.setText("Sem registros para compor o relatório!");
staticText.setHorizontalAlignment(HorizontalAlignEnum.CENTER);
jrDesignband.addElement(staticText);
jasperDesign.setNoData(jrDesignband);
// SUMMARY (Escondido)
jrDesignband = new JRDesignBand();
jrDesignband.setHeight(0);
jasperDesign.setSummary(jrDesignband);
return jasperDesign;
}
/**
* Ajusta os parametros do titulo
* @param jasperDesign
*/
private void configTitle(JasperDesign jasperDesign) {
JRDesignBand band = new JRDesignBand();
band.setHeight(50);
JRDesignStaticText staticText = new JRDesignStaticText();
staticText.setX(10);
staticText.setY(10);
staticText.setWidth(450);
staticText.setHeight(40);
staticText.setFontName("Tahoma");
staticText.setForecolor(Color.BLUE);
staticText.setHorizontalAlignment(HorizontalAlignEnum.CENTER);
staticText.setFontSize(24);
staticText.setPdfFontName("Helvetica-Bold");
staticText.setBold(true);
staticText.setText("Histórico de Consumo");
band.addElement(staticText);
jasperDesign.setTitle(band);
}
/**
* Adiciona campos ao relatorio
* @param name
* @param clazz
* @param jasperDesign
* @throws JRException
*/
private void addField(String name, Class clazz, JasperDesign jasperDesign)
throws JRException
{
JRDesignField field = new JRDesignField();
field.setName(name);
field.setValueClass(clazz);
jasperDesign.addField(field);
}
/**
* Configura a pagina
* @param jasperDesign
*/
private void configPage(JasperDesign jasperDesign) {
jasperDesign.setPageWidth(500);
jasperDesign.setPageHeight(1000);
jasperDesign.setColumnCount(1);
jasperDesign.setColumnWidth(450);
jasperDesign.setColumnSpacing(0);
jasperDesign.setLeftMargin(10);
jasperDesign.setRightMargin(10);
jasperDesign.setBottomMargin(5);
jasperDesign.setTopMargin(5);
jasperDesign.setName("RelatorioDeConsumo");
}
}

O exemplo foi feito no Eclipse Galileo. Não foi usado nada de web apesar de ser facilmente adaptado para rodar em ambiente web.

Adicione as bibliotecas no classpath do projeto que estão dentro de <DIR_INSTALL>\iReport-3.7.2\ireport\modules\ext para compilar os fontes:

ant-1.7.1.jar
antlr-2.7.6.jar
asm-attrs.jar
asm.jar
barbecue-1.5-beta1.jar
barcode4j-2.0.jar
batik-anim.jar
batik-awt-util.jar
batik-bridge.jar
batik-css.jar
batik-dom.jar
batik-ext.jar
batik-gvt.jar
batik-parser.jar
batik-script.jar
batik-svg-dom.jar
batik-svggen.jar
batik-util.jar
batik-xml.jar
bcel-5.2.jar
bsh-2.0b4.jar
castor-1.2.jar
cglib-2.1.jar
cincom-jr-xmla.jar
commons-beanutils-1.8.2.jar
commons-collections-3.2.1.jar
commons-dbcp-1.2.2.jar
commons-digester-1.7.jar
commons-javaflow-20060411.jar
commons-logging-1.1.jar
commons-math-1.0.jar
commons-pool-1.3.jar
commons-vfs-1.0.jar
dom4j-1.6.jar
ehcache-1.1.jar
eigenbase-properties-1.1.0.10924.jar
eigenbase-resgen-1.3.0.11873.jar
eigenbase-xom-1.3.0.11999.jar
ejb3-persistence.jar
groovy-all-1.5.5.jar
hibernate-annotations.jar
hibernate-commons-annotations.jar
hibernate3.jar
hsqldb-1.8.0-10.jar
iText-2.1.7.jar
iTextAsian.jar
jakarta-bcel-20050813.jar
jasperreports-3.7.2.jar
jasperreports-chart-themes-3.6.2.jar
jasperreports-extensions-3.5.3.jar
jasperreports-fonts-3.7.2.jar
javacup.jar
javassist-3.4.GA.jar
jaxen-1.1.1.jar
jcommon-1.0.15.jar
jdt-compiler-3.1.1.jar
jfreechart-1.0.12.jar
jpa.jar
js_activation-1.1.jar
js_axis-1.4patched.jar
js_commons-codec-1.3.jar
js_commons-discovery-0.2.jar
js_commons-httpclient-3.1.jar
js_jasperserver-common-ws-3.5.0.jar
js_jaxrpc.jar
js_mail-1.4.jar
js_saaj-api-1.3.jar
js_wsdl4j-1.5.1.jar
jta.jar
jxl-2.6.jar
log4j-1.2.15.jar
mondrian-3.1.1.12687-Jaspersoft.jar
olap4j-0.9.7.145.jar
png-encoder-1.5.jar
poi-3.5-FINAL-20090928.jar
rex-20080421.jar
rhino-1.7R1.jar
saaj-api-1.3.jar
slf4j-api.jar
slf4j-log4j12.jar
spring.jar
sqleonardo-2007.03.jar
swingx-2007_10_07.jar
xml-apis-ext.jar
xml-apis.jar

O projeto do Eclipse com os fontes está disponível no link abaixo:
[download id=”29″ format=”1″]

O resultado será esse:

Até mais,
Roberto

Share


11 comentários

  1. #
    George
    junho 16th, 2010 at 15:50

    Olá, Roberto. Gostaria de saber qual fonte/manual você usou como auxílio para essa implementação. Talvez eu também precise implementar relatórios dinâmicos sem uso de JRXML, mas ainda não achei tutorais a respeito, e se basear só nas docs da api é tarefa quase impossível.
    Grato pelo post.

    Responda a esse comentário
    • #
      Roberto Furutani
      junho 16th, 2010 at 16:47

      Olá

      Eu pesquisei em fóruns lista de discussões e fui juntando algumas dicas que ia encontrando para montar o post.
      Fazer isso olhando a API não é tão impossível assim, mas concordo que é dificil pois o javadoc deles não ajuda muito.
      Dá uma boa analizada no pacote net.sf.jasperreports.engine.design.

      Responda a esse comentário
  2. #
    Felipe
    setembro 24th, 2010 at 12:06

    Mas se temos o IReports, por que não utilizá-lo? Não consegui achar uma resposta pra essa pergunta.

    De qualquer forma, parabéns pela força de vontade. rsrs

    Responda a esse comentário
    • #
      Roberto Furutani
      setembro 24th, 2010 at 18:38

      Pode ser difícil usar essa forma de gerar relatório, mas de repente se você precisar incluir ou tirar uma coluna ou um campo dinamicamente temos uma opção ai.

      Responda a esse comentário
  3. #
    Erick
    novembro 18th, 2010 at 15:48

    Roberto fiz uma aqui mais não esta funcionando veja o link :

    http://www.guj.com.br/posts/list/224980.java

    vc poderia me ajudar?

    pode mandar email para erickfm8@hotmail.com

    Deste ja agradeço

    Responda a esse comentário
  4. #
    Deann Reese
    dezembro 24th, 2010 at 6:35

    Roberto fiz uma aqui mais não esta funcionando veja o link : http://www.guj.com.br/posts/list/224980.java vc poderia me ajudar? pode mandar email para erickfm8@hotmail.com Deste ja agradeço

    Responda a esse comentário
  5. #
    crm
    setembro 13th, 2011 at 11:34

    Roberto preciso fazer passando parâmetros pro iReport, sabe como fazer?

    Responda a esse comentário
  6. #
    Raul Frederico Welter
    outubro 25th, 2011 at 13:24

    Olá Roberto, primeiramente parabéns pelo tutorial.
    Agora, eu tenho o seguinte problema, criei um relatório no iReport, porém, queria compilá-lo em outra máquina sem o arquivo .jrxml (código fonte) certo? Há como fazer isso? Obrigado.

    Responda a esse comentário
  7. #
    james alberto
    julho 5th, 2012 at 21:15

    Olá estou seguindo o seu tuto, mas dá erro na linha
    jasperDesign.setDetail(jrDesignband); o java não estar encontrando o método .setDetail, vc pode ajudar ?

    Responda a esse comentário
    • #
      Jorge Palma
      julho 23rd, 2012 at 14:56

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

      Responda a esse comentário

Deixe um comentário