Seções de relatório
Discutimos a estrutura de um modelo de relatório simples no capítulo Introdução . Em linhas semelhantes, JasperReports estrutura o modelo de relatório em várias seções. Seções são partes do relatório que têm uma altura especificada e podem conter objetos de relatório como linhas, retângulos, imagens ou campos de texto.
O mecanismo de relatório itera por meio dos registros virtuais da fonte de dados de relatório fornecida, no momento do preenchimento do relatório. Dependendo do comportamento definido de cada seção, o mecanismo renderiza cada seção do relatório quando apropriado. Por exemplo, a seção de detalhes é renderizada para cada registro na fonte de dados. Quando ocorrem quebras de página, as seções de cabeçalho e rodapé da página são renderizadas conforme necessário.
Em JasperReports, terminologia e seções de relatório também são chamadas de report bands. As seções são compostas por uma ou mais bandas. Essas seções são preenchidas repetidamente no momento da geração do relatório e preparam o documento final.
Seções Principais
Um modelo de relatório no JasperReports tem as seguintes seções principais -
<title></title>
<pageheader></pageheader>
<columnheader></columnheader>
<groupheader></groupheader>
<detail></detail>
<groupfooter></groupfooter>
<columnfooter></columnfooter>
<pagefooter></pagefooter>
<lastpagefooter></lastpagefooter>
<summary></summary>
<nodata></nodata>
<background></background>
A tabela a seguir resume cada uma das seções -
S.NO | Seção e descrição |
---|---|
1 | Title Esta seção aparece apenas uma vez no início do relatório. |
2 | Page Header Esta seção aparece no início de cada página do documento gerado. |
3 | Column Header Esta seção aparece no início de cada coluna no documento gerado. Se o relatório tiver apenas uma coluna definida, as seções de cabeçalho e rodapé da coluna serão ignoradas. |
4 | Group Header Esta seção é introduzida por um grupo de relatórios (capítulo Grupos ). Cada vez que a expressão de agrupamento muda seu valor, a seção do cabeçalho do grupo é impressa acima da seção de detalhes. No caso, se mais de um grupo for definido, o cabeçalho do grupo é impresso na ordem de definição do grupo. |
5 | Detail Esta seção é repetida para cada linha de dados fornecida pela fonte de dados do relatório. A seção de detalhes pode ser composta por várias bandas. |
6 | Group Footer Esta seção é introduzida por um grupo de relatórios (capítulo Grupos ). A seção de rodapé do grupo é impressa abaixo da seção de detalhes antes que o valor da expressão de agrupamento seja alterado. O rodapé do grupo é sempre impresso para a última linha de dados na fonte de dados. No caso, se mais de um grupo for definido, o rodapé do grupo é impresso na ordem inversa da definição do grupo. |
7 | Column Footer Esta seção aparece na parte inferior de cada coluna. Se a contagem de colunas do relatório for 1, as seções de cabeçalho e rodapé da coluna serão ignoradas. |
8 | Page Footer Esta seção aparece na parte inferior de cada página. |
9 | Last Page Footer Esta seção substitui o rodapé da página regular na última página do relatório. No caso, a seção de resumo também está presente, então esta pode não ser a última página do documento. Esta seção às vezes é útil quando as informações de resumo precisam ser exibidas na parte inferior da última página. |
10 | Summary Esta seção aparece apenas uma vez no final do relatório. |
11 | No Data Esta seção é impressa quando a propriedade do relatório Quando não há impressão de dados é definida como Sem seção de dados . Se a seção <noData> for definida no modelo de relatório, e se a fonte de dados estiver vazia, a seção <noData> será a única considerada no tempo de preenchimento e seu conteúdo produzirá a saída do relatório. |
12 | Background A seção de plano de fundo é exibida em todas as páginas e não pode transbordar para a próxima página. Os elementos colocados nesta seção são avaliados no momento da inicialização da página e são exibidos em segundo plano. Todos os outros objetos de página são exibidos na parte superior dos objetos de fundo. Esta seção é útil para criar marcas d'água de página. |
Seção, Elementos e Relação de Atributo
O diagrama a seguir mostra os elementos e relacionamentos de atributos em uma seção de um relatório.
Elementos de seção
Todas as seções do relatório mencionadas acima são opcionais. Mas qualquer modelo de relatório terá pelo menos uma dessas seções. Cada uma dessas seções contém um único <band> elemento como seu único subelemento. A <band> pode conter zero ou mais subelementos seguintes -
<line>, <rectangle>, <ellipse>, <image>, <staticText>, <textField>, <subReport> ou <elementGroup>
Cada um desses elementos deve conter um único <reportElement> como seu primeiro elemento (exceto elementGroup). A <reportElement> determina como os dados são dispostos para aquele elemento específico. Ao contrário das variáveis e parâmetros, os elementos do relatório não precisam ter um nome, porque normalmente você não precisa obter nenhum elemento individual dentro de um modelo de relatório.
A tabela abaixo resume os atributos de <reportElement> -
Atributo | Descrição | Valores Válidos |
---|---|---|
x | Especifica a coordenada x do elemento da banda. | Um valor inteiro que indica a coordenada x do elemento em pixels. Este atributo é obrigatório. |
y | Especifica a coordenada y do elemento de banda. | Um valor inteiro que indica a coordenada y do elemento em pixels. Este atributo é obrigatório. |
largura | Especifica a largura do elemento da banda. | Um valor inteiro que indica a largura do elemento em pixels. Este atributo é obrigatório. |
altura | Especifica a altura do elemento da banda. | Um valor inteiro que indica a altura do elemento em pixels. Este atributo é obrigatório. |
chave | Identificador único do elemento da banda. | Um valor de string exclusivo. |
stretchType | Especifica como o elemento estica quando a banda que o contém se estica | NoStretch (default) - O elemento não estica. RelativeToTallestObject - O elemento será esticado para acomodar o objeto mais alto de seu grupo. RelativeToBand - O elemento será esticado para se ajustar à altura da faixa. |
tipo de posição | Especifica a posição do elemento quando a banda se estende. | Float - O elemento se moverá dependendo do tamanho dos elementos ao redor. FixRelativeToTop (default) - O elemento manterá uma posição fixa em relação ao topo da banda. FixRelativeToBottom - O elemento manterá uma posição fixa em relação ao fundo da banda. |
isPrintRepeatedValues | Especifica se valores repetidos são impressos. | true (default) - Valores repetidos serão impressos. false - Valores repetidos não serão impressos. |
modo | Especifica o modo de fundo do elemento | Opaco, transparente |
isRemoveLineWhenBlank | Especifica se o elemento deve ser removido quando estiver em branco e não houver outros elementos no mesmo espaço horizontal. | verdadeiro falso |
isPrintInFirstWholeBand | Especifica se o elemento deve ser impresso em uma faixa inteira, ou seja, uma faixa que não seja dividida entre páginas ou colunas do relatório. | verdadeiro falso |
isPrintWhenDetailOverFlows | Especifica se o elemento será impresso quando a banda transbordar para uma nova página ou coluna. | verdadeiro falso |
printWhenGroupChanges | Especifica que o elemento será impresso quando o grupo especificado for alterado. | Um valor de string. |
forecolor | Especifica a cor de primeiro plano do elemento. | Um valor RGB hexadecimal precedido pelo caractere # ou um dos seguintes valores predefinidos: preto, azul, ciano, cinza escuro, cinza, verde, cinza claro, magenta, laranja, rosa, vermelho, amarelo, branco. |
cor de fundo | Especifica a cor de fundo do elemento. | Igual aos valores válidos para forecolor |
Atributos de seção
A seguir estão os atributos de uma seção de relatório -
Altura
A altura da seção especifica a altura em pixels para aquela seção específica e é muito importante no design geral do relatório.
Imprimir quando expressão
Uma expressão booleana que determina se a seção deve ser impressa ou não.
Dividido permitido
Um sinalizador que indica se a seção pode ser dividida quando não cabe na página atual. Se verdadeiro, a seção será transferida para a próxima página. Observe que, caso a seção não caiba na próxima página, a seção será dividida independentemente do valor do sinalizador. splitType pode assumir os seguintes valores -
splitType = "Stretch:" Divide o conteúdo estendido. Se a seção se estende na página atual (se o espaço disponível for menor que a altura declarada), a região que é adicionada à altura original pode ser dividida na próxima página.
splitType = "Prevent:" Impede a divisão na primeira tentativa. Se a seção não couber na próxima página, a divisão ocorre normalmente, pois a prevenção de divisão de banda é eficaz apenas na primeira tentativa de divisão.
splitType = "Immediate:" Divida imediatamente. A banda pode se dividir em qualquer lugar, exceto acima, seu elemento superior.
Exemplo
Para demonstrar cada seção, vamos escrever um modelo de relatório (jasper_report_template.jrxml). Salve este arquivo emC:\tools\jasperreports-5.0.1\testdiretório. Neste arquivo, estaríamos exibindo um texto em cada uma das seções (discutidas acima). O conteúdo do arquivo é o seguinte -
<?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 = "jasper_report_template" pageWidth = "300" pageHeight = "300"
columnWidth = "300" leftMargin = "0" rightMargin = "0"
topMargin = "0" bottomMargin = "0" >
<title>
<band height = "50">
<textField>
<reportElement x = "100" y = "16" width = "100" height = "20"/>
<textElement/>
<textFieldExpression>
<![CDATA["Title"]]>
</textFieldExpression>
</textField>
</band>
</title>
<pageHeader>
<band height = "40">
<textField>
<reportElement mode = "Opaque" x = "100" y = "10"
width = "90" height = "20"/>
<textElement>
<font isBold = "true"/>
</textElement>
<textFieldExpression>
<![CDATA["Page Header"]]>
</textFieldExpression>
</textField>
</band>
</pageHeader>
<columnHeader>
<band height = "40">
<textField>
<reportElement x = "100" y = "10" width = "90" height = "20"/>
<textElement>
<font isItalic = "true"/>
</textElement>
<textFieldExpression>
<![CDATA["Column Header"]]>
</textFieldExpression>
</textField>
</band>
</columnHeader>
<detail>
<band height ="40">
<textField>
<reportElement mode = "Opaque" x = "100" y = "10"
width = "90" height = "20" backcolor = "#99CCFF"/>
<textElement/>
<textFieldExpression>
<![CDATA["Report Details"]]>
</textFieldExpression>
</textField>
</band>
</detail>
<columnFooter>
<band height = "40">
<textField>
<reportElement x = "100" y = "10" width = "90" height = "20"/>
<textElement/>
<textFieldExpression>
<![CDATA["Column Footer"]]>
</textFieldExpression>
</textField>
</band>
</columnFooter>
<pageFooter>
<band height = "40">
<textField>
<reportElement x = "100" y = "10" width = "90" height = "20"/>
<textElement/>
<textFieldExpression>
<![CDATA["Page Footer"]]>
</textFieldExpression>
</textField>
</band>
</pageFooter>
<lastPageFooter>
<band height = "40">
<textField>
<reportElement x = "100" y = "10" width = "90" height = "20"/>
<textElement/>
<textFieldExpression>
<![CDATA["Last Page Footer"]]>
</textFieldExpression>
</textField>
</band>
</lastPageFooter>
<summary>
<band height = "40">
<textField>
<reportElement x = "100" y = "10" width = "90" height = "20"/>
<textElement/>
<textFieldExpression>
<![CDATA["Summary"]]>
</textFieldExpression>
</textField>
</band>
</summary>
</jasperReport>
O código java para preencher e gerar o relatório é fornecido abaixo. Vamos salvar este arquivoJasperReportFill.java para o diretório C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint.
package com.tutorialspoint;
import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
public class JasperReportFill {
public static void main(String[] args) {
String sourceFileName = "C://tools/jasperreports-5.0.1/test/" +
"jasper_report_template.jasper";
try {
JasperFillManager.fillReportToFile(sourceFileName, null,
new JREmptyDataSource());
} catch (JRException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Aqui, usamos uma instância de JREmptyDataSource ao preencher relatórios para simular uma fonte de dados com um registro, mas com todos os campos neste único registro sendo nulos.
Geração de relatório
Vamos compilar e executar o arquivo acima usando nosso processo normal de construção ANT. O conteúdo do arquivo build.xml (salvo no diretório C: \ tools \ jasperreports-5.0.1 \ test) é o seguinte.
O arquivo de importação - baseBuild.xml é obtido no capítulo Configuração do ambiente e deve ser colocado no mesmo diretório do build.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewFillReport" basedir = ".">
<import file = "baseBuild.xml" />
<target name = "viewFillReport" depends = "compile,compilereportdesing,run"
description = "Launches the report viewer to preview
the report stored in the .JRprint file.">
<java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
<arg value = "-F${file.name}.JRprint" />
<classpath refid = "classpath" />
</java>
</target>
<target name = "compilereportdesing" description = "Compiles the JXML file and
produces the .jasper file.">
<taskdef name = "jrc"
classname = "net.sf.jasperreports.ant.JRAntCompileTask">
<classpath refid = "classpath" />
</taskdef>
<jrc destdir = ".">
<src>
<fileset dir = ".">
<include name = "*.jrxml" />
</fileset>
</src>
<classpath refid = "classpath" />
</jrc>
</target>
</project>
A seguir, vamos abrir a janela da linha de comando e ir para o diretório onde build.xml está colocado. Finalmente, execute o comandoant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport é o destino padrão) da seguinte forma -
C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.tutorialspoint.JasperReportFill
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml
clean-sample:
[delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes
[delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jasper
[delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint
compile:
[mkdir] Created dir: C:\tools\jasperreports-5.0.1\test\classes
[javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:28:
warning: 'includeantruntime' was not set, defau
[javac] Compiling 1 source file to C:\tools\jasperreports-5.0.1\test\classes
compilereportdesing:
[jrc] Compiling 1 report design files.
[jrc] log4j:WARN No appenders could be found for logger
(net.sf.jasperreports.engine.xml.JRXmlDigesterFac
[jrc] log4j:WARN Please initialize the log4j system properly.
[jrc] log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
[jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.
run:
[echo] Runnin class : com.tutorialspoint.JasperReportFill
[java] log4j:WARN No appenders could be found for logger
(net.sf.jasperreports.extensions.ExtensionsEnviro
[java] log4j:WARN Please initialize the log4j system properly.
viewFillReport:
[java] log4j:WARN No appenders could be found for logger
(net.sf.jasperreports.extensions.ExtensionsEnviro
[java] log4j:WARN Please initialize the log4j system properly.
BUILD SUCCESSFUL
Total time: 18 minutes 22 seconds
Como resultado da compilação acima, uma janela JasperViewer se abre como na tela abaixo -
Aqui, podemos ver em cada uma das seções um texto é impresso. Deve-se observar que, como JRXML contém um elemento <lastPageFooter>, ele será exibido na última página do relatório em vez do elemento <pageFooter> sendo exibido. Os elementos <columnHeader> e <columnFooter> somente serão exibidos no relatório, caso este possua mais de uma coluna.